带卷曲的php:跟随POST

时间:2016-02-12 10:04:37

标签: php redirect post curl

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

  1. 我正在向服务器发送帖子请求
  2. 服务器响应:301永久移动
  3. 然后curl_setopt($ ch,CURLOPT_FOLLOWLOCATION,TRUE)启动并跟随重定向(但通过GET请求)。
  4. 为了解决这个问题,我正在使用curl_setopt($ ch,CURLOPT_CUSTOMREQUEST," POST"),是的,现在它的重定向没有我在第一次请求中发送的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;
    }
    ?>
    

1 个答案:

答案 0 :(得分:9)

curl遵循RFC 7231 suggests,这也是浏览器通常为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选项对其进行更改,而 <c:forEach items="${users}" var="user"> <tr> <td>${user.userId}</td> <td>${user.login}</td> </tr> </c:forEach> 选项在PHP中只有非常稀疏的文档,但the libcurl docs explains it。通过在那里设置正确的位掩码,然后在重定向后进行curl 而不是更改方法。

如果您为此控制服务器端,则更容易解决的问题是确保返回307响应代码而不是301。