带有卷曲的 php:使用 POST 跟踪重定向



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

  1. 我正在向服务器发送帖子请求
  2. 服务器响应:301 永久移动
  3. 然后curl_setopt($ch、CURLOPT_FOLLOWLOCATION、TRUE(启动并遵循重定向(但通过 GET 请求(。

为了解决这个问题,我正在使用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;
}
?>

curl 遵循 RFC 7231 的建议,这也是浏览器通常对 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中似乎很少有记录,但libcurl文档解释了它。通过在此处设置正确的位掩码,您可以在重定向后使 curl 更改方法。

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

最新更新