cuRL returnin 404错误

gio*_*ima 11 php curl http

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

如果我在浏览器中访问链接页面加载OK,但如果我通过cuRL访问返回404错误...

dav*_*dav 11

我可以猜到一些可以从服务器端检查的东西,以显示错误.

1)正如其他答案所述,请务必设置所有必要的标题,您可以通过firebug进行检查,如下所示, https://s30.postimg.cc/qjcbmdye9/facebook_headers.png

或者你可以通过php get_headers函数获取标题.设置使用

curl_setopt($ch, CURLOPT_HTTPHEADER, array("HeaderName: HeaderValue"));
Run Code Online (Sandbox Code Playgroud)

2)当你在浏览器中打开一个页面时(不包括使用post方法提交表单),它会发出一个get请求,而不是post,所以如果在服务器端检查$ _GET,那么你的帖子请求就不会被考虑了.

3)如果您确定它应该是一个帖子请求(例如,它是一个表单提交),那么以下可能是一个问题:某些表单可以有隐藏字段,再次在服务器中检查,如果它们是未设置,可以返回错误.因此,您应该查看表单的源代码并将它们(如果有的话)添加到您的帖子参数中.

4)如果您要提交表单,请务必同时设置提交按钮及其名称和值,因为类似于隐藏字段,也可以检查.

5) Cookie也可能是一个问题,因为默认情况下浏览器有它,而curl则没有.要能够设置和读取cookie,请使用此代码

// set cookie 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

// use cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
Run Code Online (Sandbox Code Playgroud)

这里,$cookie_filecookie文件的路径.不知道在linux或mac中,但在windows中一定要使用cookie文件的绝对路径.

6)此外,您可以设置引用者

curl_setopt($ch, CURLOPT_REFERER, 'http://www.myaddress.com/mypage.php');
Run Code Online (Sandbox Code Playgroud)

编辑:如果是ajax请求,您可能需要添加X-Requested-With值为的标头XMLHttpRequest


R3t*_*tep 5

服务器可能会检查HTTP标头,大多数情况都是如此.

因此,添加浏览器的相同HTTP标头,使用Firebug进行验证:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('SomeName: SomeValue'));
Run Code Online (Sandbox Code Playgroud)