带Post参数的PHPredirect

我有一个网页。 这个网页将用户redirect到另一个网页,或多或less地采用以下方式:

<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提交给另一个页面。 但是,如果用户closures了JavaScript,则不起作用。 我需要知道的是:有没有办法通过PHP的方式来传递POST参数,所以redirect可以通过PHP的方式完成( header('Location: anotherpage.php'); )呢?

通过POST传递params非常重要。 我不能使用$ _SESSIONvariables,因为网页是在另一个域,因此,$ _SESSIONvariables不同。

无论如何,我只需要一个方法来调用PHP ^^ POSTvariables

提前致谢!

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

但是你可以select一个替代scheme:

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

使用curl解决scheme的示例,在域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的服务器,它只会得到它的结果。 知道如果你想redirect客户端到域,使用经典的http头。

 header('Location: http://www.domain2.com'); 

当然,这是带有硬编码值的演示代码,剩下2点:

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

希望现在更清楚,并会帮助你

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

实际上,这意味着在PHP中,您需要在redirect位置之前设置状态码:

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

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

这可以使用php cUrl lib来完成。

检查这个http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

谢谢,Sourabh

有可能的。 在这种情况下,我会使用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); 

将数据存储在会话中,然后使用GET。

不,你不能用POST做头redirect。 你有2个选项,

  1. 如果目标接受POST或GET,则可以使用GET。
  2. 在Javascript被closures的情况下,我们添加一个button。

这里是一个例子,

 <noscript> <div> <input type="submit" value="Continue"/> </div> </noscript> 

这将显示一个继续button,如果JavaScript是closures的,所以用户可以点击继续。

作为@Charles表示的示例,下面是一个可用的PHP PayPal购买表单:

  1. 用javascript检查input。 如果确定,则提交,否则显示警报。
  2. 用php检查input。 如果确定,它会创buildredirect头并删除正文HTML,否则它将再次显示相同的表单。

注意:

  1. input应该在服务器上重新检查,因为浏览器的input可能被恶意操纵。
  2. 在标题命令之前不能输出HTML,因为它们会被php警告忽略。
  3. JavaScript只能检查input的有效值,但没有AJAX,将无法检查提交之前用户想要的服务器。 所以这个方法是完整的非javascript的过程。
  4. 如果redirect目标(如PayPal)仅处理POST数据,则不需要HTML。 当然,人类的目标呢!
  5. 不幸的是,4意味着你不能只发送一个子集,甚至完整的其他一组值到新的url,并让目标页面处理在用户浏览器中打开的POST数据。 你不能通过操作$ _POST数组(这似乎只是实际数据的PHP副本)。 也许有人知道如何修改真正的POST数据集?
  6. 从5开始,没有机会收集原始表单上的隐私信息,只需将表单上的付款信息通过用户的浏览器发送给PayPal或任何其他人,以获得明确的付款批准。 这意味着AJAX需要使用两种forms,一种是不带button的私人信息,另一种是使用AJAX提交另一种forms的PayPal购买button,根据结果提交自己的forms。 您可以使用PayPal没有使用的字段,但是他们仍然在获取信息,我们不知道他们在提交的表单数据上拖曳什么。
  7. 而不是像6中那样使用AJAX,那么有3个版本的表单会比较简单:
    1. 初始捕获私人数据。
    2. 如果出现问题,请重新显示提交的数据并显示不正确的数据或后端问题。
    3. 如果确定,PayPal表单由页面底部的javascript自动提交(form.submit()),或者通过button手动提交,如果没有javascript的话。
 <?php // GET POST VARIABLES, ELSE SET DEFAULTS $sAction=(isset($_POST['action'])?$_POST['action']:''); $nAmount=(int)(isset($_POST['action'])?$_POST['amount']:0); // TEST IF AMOUNT OK $bOK=($nAmount>=10); /* TYPICAL CHECKS: 1. Fields have valid values, as a backup to the javascript. 2. Backend can fulfil the request. Such as whether the requested stock item or appointment is still available, and reserve it for 10-15 minutes while the payment goes through. If all OK, you want the new URL page, such as PayPal to open immediately. */ // IF OK if($bOK){ // CHANGE HEADER TO NEW URL $sURL='https://www.paypal.com/cgi-bin/webscr'; header('HTTP/1.1 307 Temporary Redirect'); header('Location: '.$sURL); } ?> <!DOCTYPE html> <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>Sample post redirection</title> </head> <body> <?php // IF NO ACTION OR NOT OK if(($sAction=='')||!$bOK){ ?> <h1>Sample post redirection</h1> <p>Throw money at me:</p> <form name="pp" action="<?=$_SERVER['REQUEST_URI']?>" method="post" onsubmit="check_form(this)"> <!-- <input type="hidden" name="amount" value="<?=$nAmount?>" /> --> <input type="hidden" name="business" value="paypal.email@yourdomain.com" /> <input type="hidden" name="cmd" value="_xclick" /> <input type="hidden" name="lc" value="AU" /> <input type="hidden" name="item_name" value="Name of service" /> <input type="hidden" name="item_number" value="service_id" /> <input type="hidden" name="currency_code" value="AUD" /> <input type="hidden" name="button_subtype" value="services" /> <input type="hidden" name="no_note" value="0" /> <input type="hidden" name="shipping" value="0.00" /> <input type="hidden" name="on0" value="Private" /> <input type="hidden" name="os0" value="Xxxx xxxxx xxxxx" /> <p>Amount $<input id="amount" type="text" name="amount" value="<?=$nAmount?>" /> $10 or more.</p> <p><button type="submit" name="action" value="buy">Buy</button></p> </form> <p>If all is OK, you will be redirected to the PayPal payment page.<br /> If your browser requires confirmation, click the <cite>OK</cite> button.</p> <script> // JS AT END OF PAGE TO PREVENT HTML RENDER BLOCKING // JS FUNCTION FOR LOCAL CHECKING OF FIELD VALUES function check_form(oForm){ // USE TO DETERMINE IF VALUES CORRECT var oAmount=document.getElementById('amount'); var nAmount=oAmount.value; var bOK=true; var bOK=(nAmount>=10); // EXAMINE VALUES // IF NOT OK if(!bOK){ // INDICATE WHAT'S WRONG, ALERT ETC alert('Stingy @$#&. Pay more!!'); // BLOCK FORM SUBMIT ON ALL BROWSERS event.preventDefault(); event.stopPropagation(); return false; } } </script> <?php } ?> </body> </html> 

在POSTredirectGET情况下(请参阅https://en.wikipedia.org/wiki/Post/Redirect/Get ),可以使用会话variables作为传输数据的方法。

 <?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'); }