CURL响应不同于对浏览器发送的请求的响应

时间:2011-06-02 22:02:09

标签: php curl

尝试通过PHP和命令行提交CURL表单。来自服务器的响应由空内容(下面发布的标题)组成。

当通过浏览器提交相同的URL时,响应由适当的webapge组成。

尝试通过POST和GET通过以下每个命令行curl标志“-d”“ - F”和“-G”提交CURL请求参数。

如果查询字符串参数以“-d”标志发布,则生成的标题为:

HTTP / 1.1 302暂时移动
日期:2011年6月2日星期四21:41:54 GMT
服务器:Apache
Set-Cookie:JSESSIONID = DC5F435A96A353289F58593D54B89570;路径= / XXXXXXX
P3P:CP =“CAO PSA OUR”
地点:http://www.XXXXXXXX.com/
内容长度:0
连接:关闭
内容类型:text / html; charset = UTF-8
Set-Cookie:XXXXXXXXXXXXXXXX = 1318103232.20480.0000;路径= /


如果查询字符串参数以“-F”标志发布,则生成的标头为:

HTTP / 1.1 100继续

HTTP / 1.1 500内部服务器错误
日期:2011年6月2日星期四,格林威治标准时间21:52:54 服务器:Apache
内容长度:1677
连接:关闭
Content-Type:text / html; charset = utf-8
Set-Cookie:XXXXXXXXXXXXXX = 1318103232.20480.0000;路径= /
变化:接受编码

<html><head><title>Apache Tomcat/5.5.26 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>javax.servlet.ServletException: Servlet execution threw an exception<br>
</pre></p><p><b>root cause</b> <pre>java.lang.NoClassDefFoundError: com/oreilly/servlet/multipart/MultipartParser<br>
    com.corsis.tuesday.servlet.mp.MPRequest.<init>(MPRequest.java:27)<br>
    com.corsis.tuesday.servlet.mp.MPRequest.<init>(MPRequest.java:21)<br>
    com.corsis.tuesday.servlet.TuesdayServlet.doPost(TuesdayServlet.java:494)<br>
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)<br>
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br>
</pre></p><p><b>note</b> <u>The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/5.5.26</h3></body></html>

问题:

  1. 根据CURL请求的性质,可能导致服务器响应的原因。

  2. 如何通过CURL成功提交请求?

3 个答案:

答案 0 :(得分:1)

HTTP/1.1 100 Continue

之前我遇到过与此标题相关的问题。有些服务器根本不理解它。尝试使用此选项覆盖Expect标题。

curl_setopt( $curl_handle, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

答案 1 :(得分:0)

要添加理查德所说的内容,我已经看到服务器检查用户代理字符串并根据其值表现不同的情况。

答案 2 :(得分:0)

我刚刚有过这方面的经验以及解决这个问题的原因。在我的情况下,我登录到服务器,所以我可以上传文件,让服务器对它进行操作,然后下载新文件。我首先在Chrome中执行此操作,并使用开发工具在此简单事务中捕获超过100个HTTP请求。如果我试图从命令行执行所有这些操作,大多数只是抓取我不需要的资源,因此我只过滤掉了我至少应该需要的知识。

最初,这归结为GET设置cookie并使用用户名和密码登录,上传文件的POST,执行文件工作的POST以及检索新文件的GET。我无法获得第一个实际工作的POST。来自该POST的响应应该是包含上传ID,上传时间等的信息,但是我获得了空的JSON列表,即使状态为200 OK。

我使用CURL来完全欺骗来自浏览器的请求(复制用户代理,覆盖Expect等)并且仍然没有得到任何结果。然后我开始随意添加我在第一次GET和POST之间从Chrome中捕获的一些请求,并且在POST之前添加了JSON历史记录的GET请求后,POST实际上返回了它应该的内容。

TL; DR一些网站在初次登录后需要更多请求才能发布。我会尝试捕获服务器和浏览器之间的成功交换,并查看所有请求。有些请求可能不像看起来那样多余。