curL 返回 404 错误
Posted
技术标签:
【中文标题】curL 返回 404 错误【英文标题】:cuRL returnin 404 error 【发布时间】:2014-01-26 21:14:14 【问题描述】:我正在使用 cuRL 从远程服务器获取一些数据...响应是 JSON 格式.. 这是我的代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_URL, 'http://www.myaddress.com/mypage.php');
curl_setopt($ch, CURLOPT_POSTFIELDS, array("id" => $id));
$return = curl_exec($ch);
curl_close($ch);
如果我在浏览器中访问该链接,页面加载正常,但如果我通过 cuRL 访问返回 404 错误...
【问题讨论】:
你能先检查被调用页面的标题,以验证你是否有代码 200 或其他内容吗? 另外,你检查过这篇文章吗:***.com/questions/17476828/… curl_getinfo在http_code中返回404 同一个url,here得到什么http状态? 该 URL 是否可访问?如果有,可以在这里分享一下吗? 【参考方案1】:我可以猜到一些可以从服务器端检查的东西,以显示错误。
1) 正如其他答案中所述,请务必设置所有必要的标题,您可以检查它们,例如由萤火虫,如这里所示,
或者您可以通过 php get_headers 函数获取标题。 设置它使用
curl_setopt($ch, CURLOPT_HTTPHEADER, array("HeaderName: HeaderValue"));
2) 当您在浏览器中打开页面时(不包括使用 post 方法提交的表单),它会发出 get 请求,而不是 post,因此如果在服务器端检查 $_GET,那么您的发帖请求将不会被考虑。
3) 如果您确定它应该是一个 post 请求(例如,它是一个表单提交),那么以下可能是一个问题:某些表单可以有隐藏字段,这又是在服务器中检查,如果没有设置,可以返回错误。因此,您应该查看表单的源代码并将它们(如果有)添加到您的帖子参数中。
4)如果您正在提交表单,请务必设置提交按钮的名称和值,因为类似于隐藏字段,这也可以检查。
5) Cookies 也可能是个问题,因为默认情况下浏览器有它,而 curl 没有。要能够设置和读取 cookie,请使用此代码
// set cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// use cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
这里,$cookie_file
cookie 文件的路径。不知道是在linux还是mac,但是在windows中一定要使用cookie文件的绝对路径。
6)另外,您可以通过
设置referercurl_setopt($ch, CURLOPT_REFERER, 'http://www.myaddress.com/mypage.php');
编辑:如果是 ajax 请求,您可能需要添加一个标头 X-Requested-With
,其值为 XMLHttpRequest
【讨论】:
【参考方案2】:服务器可能会检查 HTTP Header,大多数情况下都是这种情况。
所以添加你浏览器的相同HTTP Header,用Firebug 验证:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('SomeName: SomeValue'));
【讨论】:
【参考方案3】:浏览器发送的 cURL 代码可能不是其他内容。您可以使用其他人推荐的任何工具,Firebug、Wireshark、Fiddler 等。
您需要做的是在请求中添加缺失的部分,以在 cURL 请求中尽可能地匹配浏览器,直到远程页面以 200 响应。
我注意到您正在使用POST
。在许多情况下,您的浏览器发生的情况是您访问带有GET
请求的页面。在远程站点上初始化一个会话,并在您的浏览器中保存一个带有会话 ID 的 cookie。
然后需要与后续的POST
请求一起提供此 cookie。 PHP cURL 有许多支持 cookie 的选项。可能还有CSRF tokens等其他要求。
再一次,逆向工程是关键。
【讨论】:
同意。使用 Fiddler 或 Burp Suite 对其进行调试,然后发送相同的数据。以上是关于curL 返回 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
JBoss WildFly 13 上的 RESTful Web 服务适用于浏览器和 curl,但不适用于单元测试 - 404 错误
普通 Flask-Restless 应用程序上的 HTTP 404 错误