无法直接从服务器执行此操作,因为 POST 数据应由浏览器发送。
但是你可以选择一个替代方案:
- 在您的示例中自动提交的预填表单可以工作,但正如您所写的那样,这不是一个很好的做法,可能会让用户停留在空白页面上
- 接收 GET 参数并使用 curl(或任何像样的 HTTP 客户端)将它们 POST 到第二个站点,然后将结果传输到浏览器。这称为代理,恕我直言,这可能是一个很好的解决方案。
- 跨域进行会话共享,这在所有设置中都是不可能的,并且可能很复杂。设置完成后,会话共享对 PHP 代码几乎是透明的。如果您对 2 个域之间的通信有不止一种需求,那么这样做是值得的。
curl 解决方案示例,在域 1 上运行的代码:
//retrieve GET parameters as a string like arg1=0&arg1=56&argn=zz
$data = $_SERVER['QUERY_STRING'];
// Create a curl handle to domain 2
$ch = curl_init('http://www.domain2.com/target_script.php');
//configure a POST request with some options
curl_setopt($ch, CURLOPT_POST, true);
//put data to send
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//this option avoid retrieving HTTP response headers in answer
curl_setopt($ch, CURLOPT_HEADER, 0);
//we want to get result as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//if servers support is and you want result faster, allow compressed response
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
//execute request
$result = curl_exec($ch);
//show response form domain 2 to client if needed
echo $result;
就是这样,您客户端的浏览器甚至不会看到域 2 服务器,它只会从中获得结果。知道是否要将客户端重定向到域,请使用经典的 HTTP 标头进行。
header('Location: http://www.domain2.com');
当然,这是带有硬编码值的演示代码,还有两点留给您:
- 安全性:应该过滤或重新创建查询字符串以仅传输需要的参数,并且您应该断言域 2 上的服务器返回 200 HTTP 代码。
- 应用程序逻辑在这部分应该需要一些调整:如果域 2 应用程序希望在访问者到来的同一请求中获取发布数据,它不会这样做。从域 2 的角度来看,执行 POST 请求的客户端将是托管域 1 的服务器而不是客户端浏览器,如果客户端 IP 问题或其他客户端检查在域 2 上完成,这一点很重要。如果 POST 请求用于显示客户端特定的内容,您还必须进行一些服务器端跟踪,以将先前发布的数据与被重定向的访问者结合起来。