Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.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
带Curl的php:跟随带POST的重定向_Php_Redirect_Post_Curl - Fatal编程技术网

带Curl的php:跟随带POST的重定向

带Curl的php:跟随带POST的重定向,php,redirect,post,curl,Php,Redirect,Post,Curl,我有一个脚本,可以将POST数据发送到多个页面。但是,我在向某些服务器发送请求时遇到了一些困难。原因是重定向。模型如下: 我正在向服务器发送post请求 服务器响应:301已永久移动 然后curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE)启动并遵循重定向(但通过GET请求) 为了解决这个问题,我正在使用curl_setopt($ch,CURLOPT_CUSTOMREQUEST,“POST”),是的,现在它的重定向没有我在第一个请求中发送的帖子正文内容。重定向

我有一个脚本,可以将POST数据发送到多个页面。但是,我在向某些服务器发送请求时遇到了一些困难。原因是重定向。模型如下:

  • 我正在向服务器发送post请求
  • 服务器响应:301已永久移动
  • 然后curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE)启动并遵循重定向(但通过GET请求)
  • 为了解决这个问题,我正在使用curl_setopt($ch,CURLOPT_CUSTOMREQUEST,“POST”),是的,现在它的重定向没有我在第一个请求中发送的帖子正文内容。重定向时如何强制curl发送帖子正文?谢谢

    下面是一个例子:

    <?php 
    function curlPost($url, $postData = "")
    {
        $ch = curl_init () or exit ( "curl error: Can't init curl" );
        $url = trim ( $url );
        curl_setopt ( $ch, CURLOPT_URL, $url );
        //curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postData );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 30 );
        curl_setopt ( $ch, CURLOPT_TIMEOUT, 30 );
        curl_setopt ( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36");
        curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, TRUE);
    
        $response = curl_exec ( $ch );
        if (! $response) {
            echo "Curl errno: " . curl_errno ( $ch ) . " (" . $url . " postdata = $postData )\n";
            echo "Curl error: " . curl_error ( $ch ) . " (" . $url . " postdata = $postData )\n";
            $info = curl_getinfo($ch);
            echo "HTTP code: ".$info["http_code"]."\n";
            // exit();
        }
        curl_close ( $ch );
        // echo $response;
        return $response;
    }
    ?>
    
    curl遵循的是什么,这也是浏览器通常为301响应所做的:

      Note: For historical reasons, a user agent MAY change the request
      method from POST to GET for the subsequent request.  If this
      behavior is undesired, the 307 (Temporary Redirect) status code
      can be used instead.
    
    如果您认为这是不可取的,您可以使用
    CURLOPT_POSTREDIR
    选项对其进行更改,该选项在PHP中的文档似乎非常稀少,但却很少。通过在那里设置正确的位掩码,然后在重定向之后使curl not change方法生效


    如果您为此控制服务器端,一个更简单的修复方法是确保返回307响应代码而不是301。

    将您的php代码与exampleWow一起发布,谢谢。在网上找不到关于这件事的任何消息。另外,php说:“注意:使用未定义的常量CURL\u REDIR\u POST\u ALL”,所以没有定义这个常量,我只使用了CURL\u setopt($ch,CURLOPT\u POSTREDIR,3)。现在很好用。再次感谢你,你做得很好!