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)另外,您可以通过

设置referer
curl_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 错误的主要内容,如果未能解决你的问题,请参考以下文章

从 cURL 进行 API 调用时找不到资源 404 错误

JBoss WildFly 13 上的 RESTful Web 服务适用于浏览器和 curl,但不适用于单元测试 - 404 错误

普通 Flask-Restless 应用程序上的 HTTP 404 错误

404 curl_error当我在CURLOPT_HTTPHEADER中添加PayPal-Mock-Response时

远程 URL 上存在图像,但 curl 给我 404 状态

使用带护照的 jwt 得到 404 错误