如何用带Post参数的PHP重定向?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我有一个网页。该网页将用户重定向到另一个网页,或多或少采用以下方式:

<form method="post" action="anotherpage.php" id="myform">

    <?php foreach($_GET as $key => $value){
    echo "<input type='hidden' name='{$key}' value='{$value}' />";
    } ?>

</form>
<script>

    document.getElementById('myform').submit();

</script>

那么,你看,我所做的是将GET PARAMS转换为POST PARAMS。不要告诉我这是不好的,我知道我自己,这并不是我真正做的,重要的是我从数组中收集数据并尝试通过POST提交给另一个页面。但是,如果用户关闭了JavaScript,它将无法工作。我需要知道的是:有没有一种方法可以通过PHP传输POST参数,因此重定向也可以通过PHP方式完成(header('Location: anotherpage.php');)?

通过POST传递参数对我来说非常重要。我无法使用$ _SESSION变量,因为网页位于另一个域中,因此$ _SESSION变量不同。

无论如何,我只需要一种方法来使用PHP ^^传输POST变量

提问于
用户回答回答于

无法直接从服务器执行此操作,因为POST数据应该由浏览器发送。

但是你可以选择一个替代方案:

  • 在你的示例中自动提供的预填表单可以工作,但是如你所写,这并不是很好的做法,可以让用户留在空白页面
  • 接收GET参数并使用curl(或任何体面的http客户端)将它们发布到第二个站点,然后将结果传输到浏览器。这被称为代理,可能是一个很好的解决方案。
  • 跨域进行会话共享,这在所有设置中都是不可能的,并且可能很复杂。一旦完成设置,会话共享对于PHP代码几乎是透明的。如果你在两个域之间有多个需要的通信,那么值得这样做。

使用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分:

  • 安全性:应该过滤或重新创建查询字符串以仅传输所需的参数,并且您应该声明域2上的服务器返回了200 HTTP代码。
  • 应用程序逻辑应该在这部分上需要很少的调整:如果域2应用程序希望在访问者来到的同一请求中获得发布数据,则不会这样做。从域2的角度来看,执行POST请求的客户端将是服务器托管域1而不是客户端浏览器,如果客户端IP事务或其他客户端检查在域2上完成,则很重要。如果POST请求用于显示客户端特定内容,还必须进行一些服务器端跟踪,以将之前发布的数据与访问者重定向相结合。
用户回答回答于

你可以标题重定向POST请求,并包含POST信息。但是,你需要显式返回HTTP状态代码307.浏览器将302视为使用GET进行重定向,忽略原始方法。这在HTTP文档中明确提到:

实际上,这意味着在PHP中你需要在重定向位置之前设置状态码:

    header('HTTP/1.1 307 Temporary Redirect');
    header('Location: anotherpage.php');

但是请注意,根据HTTP规范,用户代理必须询问用户是否可以将POST信息重新提交给新的URL。实际上,Chrome并不询问,Safari也不提供,但Firefox会向用户显示一个确认重定向的弹出框。根据您的操作限制,也许这是可以的,尽管在一般使用情况下它肯定有可能引起最终用户的混淆。

扫码关注云+社区