带有Post参数的PHP重定向
我有一个网页。此网页将用户重定向到另一个网页,大致如下所示:带有Post参数的PHP重定向,php,javascript,post,redirect,parameters,Php,Javascript,Post,Redirect,Parameters,我有一个网页。此网页将用户重定向到另一个网页,大致如下所示: <form method="post" action="anotherpage.php" id="myform"> <?php foreach($_GET as $key => $value){ echo "<input type='hidden' name='{$key}' value='{$value}' />"; } ?> </form> <
<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>
这可以使用php cUrl lib完成
检查这个
谢谢,
Sourabh将数据存储在会话中,然后使用GET。否。您不能使用POST进行标题重定向。你有两个选择
如果目标接受POST或GET,则可以使用GET
在Javascript关闭的罕见情况下,我们会添加一个按钮
举个例子,
<noscript>
<div>
<input type="submit" value="Continue"/>
</div>
</noscript>
如果Javascript关闭,这将显示“继续”按钮,以便用户可以单击继续。无法直接从服务器执行此操作,因为POST数据应由浏览器发送
但您可以选择一个替代方案:
- 您的示例中自动提交的预填充表单ini可能会起作用,但正如您编写的那样,这并不是很好的实践,可能会让用户处于空白页上
- 接收GET参数并将它们与curl(或任何合适的http客户端)一起发布到第二个站点,然后将结果传输到浏览器。这称为代理,可能是imho的一个好解决方案
- 跨域进行会话共享,这不可能在所有设置上都实现,而且可能很复杂。
一旦安装完成,会话共享对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上的服务器返回了200 HTTP代码
- 应用程序逻辑在这一部分应该不需要太多的调整:如果域2应用程序希望在访客到来的同一请求中获得post数据,它将不会这样做。从域2的角度来看,执行POST请求的客户端将是承载域1的服务器,而不是客户端浏览器,如果客户端IP问题或在域2上执行其他客户端检查,这一点很重要。
如果POST请求用于显示特定于客户端的内容,那么您还必须进行一些服务器端跟踪,以将以前发布的数据与被重定向的访问者相结合
希望它现在更清楚了,并将帮助您这是可能的。在这种情况下,我将使用cURL:
$url = 'http://domain.com/get-post.php';
foreach($_GET as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
您可以头重定向POST请求,并包含POST信息。但是,您需要显式返回HTTP状态代码307。浏览器将302视为带有for GET的重定向,忽略原始方法。HTTP文档中明确指出了这一点:
实际上,这意味着在PHP中,您需要在重定向位置之前设置状态代码:
header('HTTP/1.1 307 Temporary Redirect');
header('Location: anotherpage.php');
但是,请注意,根据HTTP规范,用户代理必须询问用户是否可以将POST信息重新提交到新URL。实际上,Chrome不会询问,Safari也不会,但Firefox会向用户提供一个确认重定向的弹出框。根据您的操作限制,这可能是可以的,但在一般使用情况下,它肯定会给最终用户带来混乱。作为@Charles所指出的示例,这里是一个可用的php PayPal购买表单:
使用javascript检查输入。如果确定,则提交,否则显示警报
用php检查输入。如果确定,它将创建重定向头并删除主体HTML,否则它将再次显示相同的表单
请注意:
应该在服务器上重新检查输入,因为浏览器的输入可能被恶意操纵
在头命令之前不能输出任何HTML,因为它们将被忽略并显示php警告
Javascript只能检查输入的有效值,但是如果没有AJAX,就无法在提交之前检查服务器是否有用户想要的任何内容。因此,此方法是完整的非javascript过程
如果重定向目标(如PayPal)仅处理POST数据,则不需要HTML。当然,目标是人类李>
不幸的是,4意味着您不能只向新url发送一个子集,甚至是一组完整的其他值,并且不能让处理POST数据的目标页面在用户浏览器中打开。您不能通过操纵$\u POST数组(它似乎只是实际数据的一个PHP副本)来实现这一点。也许有人知道如何修改真实的POST数据集
从5开始,就没有机会收集网站上的私人信息
原始表单,只需在
通过用户浏览器向PayPal或任何人发送表单,以获得其明确的付款批准。这意味着需要AJAX来实现这一点
使用两种表单,一种不带按钮地保存私人信息,另一种
另一个表单带有PayPal buy按钮,使用AJAX提交
另一个表单,根据结果,提交自己的表单。
您可以使用PayPal不使用的字段,但它们仍然是
得到了信息,我们不知道他们在搜捕什么
提交的表格数据
与第6节中使用AJAX相比,使用3个版本的表单要简单得多:
初始化以捕获私有数据
如果出现问题,请重新显示带有提交数据的表单,并指出不正确的数据或后端问题
如果确定,则是一个PayPal表单,由javascript在
页面底部(form.submit()),或者如果没有javascript,则通过按钮手动提交请求
示例后重定向
示例后重定向
向我扔钱:
在后重定向GET情况下,(请参阅),可以将会话变量用作transportin的方法
<?php
session_start();
// return is the name of a checkbox in the post-redirect-get.php script.
if(isset($_POST['return'])) {
// We add some data based on some sort of computation and
// return it to the calling script
$_SESSION['action']="This string represents data in this example!";
header('location: post-redirect-get.php');
}
$res = "<form action='/path/to/new/page' method='POST' id='redirectHack'>
<input type='hidden' id='postVar1' name='postVar1' value='12345'>
<input type='hidden' id='postVar2' name='postVar2' value='67890'>
</form>
<script>
document.getElementById('redirectHack').submit()
</script>";
die($res);