【问题标题】:php with Curl: follow redirect with POST带有 Curl 的 php:使用 POST 跟随重定向
【发布时间】:2026-02-01 20:15:02
【问题描述】:

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

  1. 我正在向服务器发送 post 请求
  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;
}
?>

【问题讨论】:

  • 用例子把你的php代码放在post中

标签: php redirect post curl


【解决方案1】:

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 选项更改它,它在 PHP 中的文档似乎很少,但 the libcurl docs explains it。通过在此处设置正确的位掩码,您可以在 curl not 跟随重定向时更改方法。

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

【讨论】:

  • 哇,谢谢。在网上没有找到任何关于此的信息。此外,php 说:“注意:使用未定义的常量 CURL_REDIR_POST_ALL”所以没有这个常量定义,我只是使用 curl_setopt($ch,CURLOPT_POSTREDIR,3)。现在效果很好。再次感谢,你的不错!