【问题标题】:Curl : * Violate RFC 2616/10.3.2 and switch from POST to GETCurl : * 违反 RFC 2616/10.3.2 并从 POST 切换到 GET
【发布时间】:2011-11-16 17:35:47
【问题描述】:

我正在使用 curl 发布到脚本。

curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);

但是涉及到 301 重定向,导致 curl 从 POST 切换到 GET。

HTTP/1.1 301 永久移动

请问有谁知道如何防止 curl 切换到 GET?

【问题讨论】:

    标签: php post curl get libcurl


    【解决方案1】:

    CURLOPT_POSTREDIR 可以设置为配置此行为(curl 中基于 301 位置标头的自动重定向的请求方法):

    curl_setopt( , CURLOPT_POSTREDIR, 3);

    这里 3 告诉 curl 模块重定向 301 和 302 请求。

    0,1,2,3 是最后一个参数的有效选项。

    0 -> 不设置任何行为
    1 -> 仅针对 301 重定向使用相同类型的请求跟随重定向。
    2 -> 仅针对 302 重定向使用相同类型的请求跟随重定向。
    3 -> 对 301 和 302 重定向使用相同类型的请求跟随重定向。

    另见:Request #49571 CURLOPT_POSTREDIR not implemented,它有一些有用的 cmets,比如设置自定义请求方法:

    curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    

    【讨论】:

    • 谢谢,看起来可能是这个。明天去看看。
    【解决方案2】:

    来自the latest draft of HTTP

    注意:由于历史原因,用户代理可能会更改请求方法 从 POST 到 GET 用于后续请求。如果这种行为是 不需要,可以使用状态码 307(临时重定向)代替。

    我认为 303 See Other 可能也适合。

    【讨论】:

      【解决方案3】:

      好吧,面对重新编译 php,因为我的 curl 不支持 POSTREDIR,我决定用 JQuery 解决这个问题。希望这对某人有帮助!

      <head>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
      <script>
      
      $.post("path/path/callback.php", { "key":"value", "key2":"value2"});
      
      </script>
      </head>
      hello
      
      </html>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-16
        • 2012-09-06
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多