在使用CURL重定向到GET期间,附加到POST请求的数据消失了

Max*_*tin 7 linux redirect curl

我写了follow命令将带有JSON数据的POST发送到服务器.服务器必须重定向我的请求并使用相同的数据发送GET:

curl  -L -i -XPOST \
     -d 'id=105' \
     -d 'json={"orderBy":0,"maxResults":50}'  http://mysite.com/ctlClient/
Run Code Online (Sandbox Code Playgroud)

我得到回应:

HTTP/1.1 302 Found
Date: Thu, 04 Jul 2013 13:12:08 GMT
Server: Apache
X-Powered-By: PHP/5.3.19
Set-Cookie: PHPSESSID=1hn0g8d7gtfl4nghjvab63btmk2; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
location: http://mysite.com/fwf/online/
Content-Length: 0
Connection: close
Content-Type: text/html

HTTP/1.1 200 OK
Date: Thu, 04 Jul 2013 13:12:08 GMT
Server: Apache
X-Powered-By: PHP/5.3.19
Set-Cookie: PHPSESSID=16akc7kdcoet71ipjflk9o9cnm5; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Connection: close
Content-Type: text/html
Run Code Online (Sandbox Code Playgroud)

从访问日志我看到:

 "POST /ctlClient/ HTTP/1.1" 302 - "-" "Apache-HttpClient/4.1 (java 1.5)"
 "GET /fwf/online/ HTTP/1.1" 200 1 "-" "Apache-HttpClient/4.1 (java 1.5)"
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好,

问题是GET没有收到我添加到帖子的数据.听起来像在重定向期间,我的数据以某种方式被驳回.从Android客户端它可以工作,因此它不是服务器端问题.

我需要做什么才能将POST数据传递给GET请求?

非常感谢你,

[编辑]

@nif提议升级CURL到7.28.0.

仍然遇到同样的问题

[信息]

我第一次去http://mysite.com/ctlClient/index.php哪里:

 case 105: // id=105
        session_unset();
        session_start();
        foreach($_POST as $key => $value){$_SESSION[$key] = $value;}
        ctlGotoSameDomain("/fwf/online/"); // <- aka redirect
        return true;
Run Code Online (Sandbox Code Playgroud)

重定向后我去/fwf/online/index.php那里我的请求是空的:

public function __construct() {
        $this->json = isset($_SESSION['json']) ? $_SESSION['json'] : null;
        msqLogFile("fwf/post", Array('post' => 'Request: '.$this->json));

    }
Run Code Online (Sandbox Code Playgroud)

http://mysite.com/ctlClient/index.php正确获得2个参数:idjson

nif*_*nif 7

curl的手册页:

当curl遵循重定向并且请求不是普通的GET(例如POST或PUT)时,如果HTTP响应是301,302或303,它将使用GET执行以下请求.如果响应代码是任何其他3xx代码,curl将使用相同的未修改方法重新发送以下请求.

编辑

我做了一些研究,发现它可能是你卷曲版本的一个问题.较新的版本将尊重该-XPOST选项,并将POST转移到重定向的位置.但旧版本有自己的选择,即--post301--post302.根据他们的手册页:

--post301告诉curl遵循RFC 2616/10.3.2,并且在执行301重定向时不将POST请求转换为GET请求.非RFC行为在Web浏览器中无处不在,因此curl默认情况下进行转换以保持一致性.但是,服务器可能需要POST才能在重定向后保留POST.只有在使用-L, - location(在7.17.1中添加)时,此选项才有意义

--post302告诉curl遵守RFC 2616/10.3.2,并且在执行302重定向时不将POST请求转换为GET请求.非RFC行为在Web浏览器中无处不在,因此curl默认情况下进行转换以保持一致性.但是,服务器可能需要POST才能在重定向后保留POST.只有在使用-L, - location(在7.19.1中添加)时,此选项才有意义

参考文献:

  • 7.28.0应该有`--post301`和`--post302`选项.你试过吗? (2认同)