Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Post参数的PHP重定向_Php_Javascript_Post_Redirect_Parameters - Fatal编程技术网

带有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);