php file_get_contents - 无法打开流:HTTP 请求失败!未找到 HTTP/1.1 404
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9574130/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
file_get_contents - failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
提问by user1250758
I'm having some weird problems with file_get_contents after moving my site to a new domain. I had to set up a new domain and IP address (using Plesk) to get a new ssl certificate working. Now my file_get_contents calling a script on the same domain is giving me this:
将我的网站移动到新域后,我遇到了一些关于 file_get_contents 的奇怪问题。我必须设置一个新的域和 IP 地址(使用 Plesk)才能使新的 ssl 证书生效。现在我的 file_get_contents 在同一个域上调用脚本给了我这个:
failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
无法打开流:HTTP 请求失败!未找到 HTTP/1.1 404
If I call the same url using file_get_contents on another server it works fine, and if I call www.google.com from the server thats failing that works, so it only seems to be if I call a url on the same sever!
如果我在另一台服务器上使用 file_get_contents 调用相同的 url ,它工作正常,如果我从服务器调用 www.google.com ,那是失败的,所以它似乎只有当我在同一台服务器上调用 url 时!
I have a feeling it might have something to do with having two IPs with two different ssl certificates on the one server, when i file_get_contents / (index page) of the server from the server I get the plesk 'this is a new domain' page so its like apache isnt looking up the right virtual host when its called from its own sever.
我有一种感觉,这可能与在一台服务器上有两个 IP 和两个不同的 ssl 证书有关,当我从服务器获取服务器的 file_get_contents /(索引页)时,我收到了 plesk '这是一个新域' 页面所以当它从它自己的服务器调用时,它就像 apache 没有查找正确的虚拟主机。
To clarify (hopefully!):
澄清(希望如此!):
On the server hosting the domain:
在托管域的服务器上:
file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');
gives "failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found"
给出“无法打开流:HTTP 请求失败!HTTP/1.1 404 未找到”
file_get_contents('http://www.google.com');
works correctly
工作正常
On another server:
在另一台服务器上:
file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');
works fine.
工作正常。
I have tried turning ssl off and I still get the same problem.
我试过关闭 ssl,但我仍然遇到同样的问题。
回答by GolezTrol
I've had this problem too, when I working on a little test server at home. The domain name is resolved to your external IP address, and a request is sent. But because the request is coming from inside your network, the router doesn't recognise it as a normal request. It probably has a web interface for configuring it, and tries to return a page from its own management system, which is then not found at the path you specified.
当我在家里的一个小测试服务器上工作时,我也遇到了这个问题。域名解析为您的外部 IP 地址,并发送请求。但是由于请求来自您的网络内部,路由器不会将其识别为正常请求。它可能有一个用于配置它的 Web 界面,并尝试从其自己的管理系统返回一个页面,然后在您指定的路径中找不到该页面。
In that case, I was working on a Windows PC, and I could solve it by adding the domain I was testing to my hosts
file, specifying 127.0.0.1 as the IP-address (or the IP-address of the server, if it is another machine within the same network). In Linux there should be a similar solution, I think.
在那种情况下,我在 Windows PC 上工作,我可以通过将我正在测试的域添加到我的hosts
文件中来解决它,指定 127.0.0.1 作为 IP 地址(或服务器的 IP 地址,如果它是同一网络中的另一台机器)。我认为在 Linux 中应该有类似的解决方案。
The problem isn't PHP or your server, but your router.
问题不在于 PHP 或您的服务器,而在于您的路由器。
回答by Stephen Senkomago Musoke
回答by CPHPython
If you just need to handle the warningwhen the URL is not found (as I did), you may just do this to turn Warningsinto Exceptions:
如果您只需要在未找到 URL 时处理警告(就像我所做的那样),您可以这样做以将警告转换为异常:
set_error_handler(
function ($err_severity, $err_msg, $err_file, $err_line, array $err_context) {
// do not throw an exception if the @-operator is used (suppress)
if (error_reporting() === 0) return false;
throw new ErrorException( $err_msg, 0, $err_severity, $err_file, $err_line );
},
E_WARNING
);
try {
$contents = file_get_contents($your_url);
} catch (Exception $e) {
echo $e->getMessage();
}
restore_error_handler();
Solution based on this thread/question.
基于此线程/问题的解决方案。
回答by Abdelali AHBIB
Try to do this :
尝试这样做:
file_get_contents('https://mydomain.com?'.urlencode('limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12'));