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

时间:2013-07-04 13:18:19

标签: linux redirect curl

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

curl  -L -i -XPOST \
     -d 'id=105' \
     -d 'json={"orderBy":0,"maxResults":50}'  http://mysite.com/ctlClient/

我得到回应:

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

从访问日志中我看到:

 "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)"

到目前为止一切顺利,

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

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

非常感谢,

[编辑]

@nif提议将CURL升级到7.28.0。

仍然遇到同样的问题

[INFO]

我第一次去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;

重定向后,我转到/fwf/online/index.php,我的请求为空:

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

    }

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

2 个答案:

答案 0 :(得分:7)

来自curl's manpage

  

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

修改

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

  

- post301   告诉curl尊重RFC 2616 / 10.3.2并且不将POST请求转换为GET   跟随301重定向时的请求。非RFC行为无处不在   在Web浏览器中,所以curl默认进行转换以进行维护   一致性。但是,服务器可能需要POST才能在此之后保留POST   重定向。仅当使用-L, - location时,此选项才有意义   (在7.17.1中添加)

     

- post302   告诉curl尊重RFC 2616 / 10.3.2并且不将POST请求转换为GET   跟随302重定向时的请求。非RFC行为无处不在   在Web浏览器中,所以curl默认进行转换以进行维护   一致性。但是,服务器可能需要POST才能在此之后保留POST   重定向。仅当使用-L, - location时,此选项才有意义   (在7.19.1中添加)

<强>参考文献:

答案 1 :(得分:0)

我需要在我的脚本中添加-b以启用Cookie。 CURL默认情况下不使用它们,此问题导致会话ID更改。因此没有数据传输。

curl -b -L -i -X POST \
 -d 'id=105' \
 -d 'json={"orderBy":0,"maxResults":50}'  http://mysite.com/ctlClient/

现在正在运作