file_get_contents - 无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到

Posted

技术标签:

【中文标题】file_get_contents - 无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到【英文标题】:file_get_contents - failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 【发布时间】:2012-03-23 08:47:51 【问题描述】:

将我的网站移动到新域后,我在使用 file_get_contents 时遇到了一些奇怪的问题。我必须设置一个新的域和 IP 地址(使用 Plesk)才能使新的 ssl 证书正常工作。现在我的 file_get_contents 在同一个域上调用一个脚本给了我这个:

打开流失败:HTTP 请求失败! HTTP/1.1 404 未找到

如果我在另一台服务器上使用 file_get_contents 调用相同的 url,它工作正常,如果我从失败的服务器调用 www.google.com,那么它似乎只有在同一服务器上调用 url !

我感觉这可能与在一台服务器上拥有两个具有两个不同 ssl 证书的 IP 有关,当我从服务器获取服务器的 file_get_contents /(索引页面)时,我得到了 plesk '这是一个新的domain' 页面,因此它就像 apache 在从自己的服务器调用时没有查找正确的虚拟主机。

澄清(希望如此!):

在托管域的服务器上:

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');

给出“打开流失败:HTTP 请求失败!HTTP/1.1 404 Not Found”

file_get_contents('http://www.google.com');

正常工作

在另一台服务器上:

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');

工作正常。

我已尝试关闭 ssl,但仍然遇到同样的问题。

【问题讨论】:

发布完整代码将帮助您更好地获得正确答案 N e w B e e 是对的,我不确定我是否理解这一点。 你能在你的脚本中测试echo gethostbyname('mydomain.com');吗?并向我们​​展示您的虚拟主机配置。 您能否在托管域的服务器上发出 ping 或某种 DNS 解析? 404表示找不到文件,与SSL无关。另外,您是否有权访问网络服务器的访问日志?也许你会在那里找到一些线索。另外,如果您尝试从自己的浏览器访问该 URL,结果如何? 我在旧版 Windows 服务器上遇到了同样的问题 【参考方案1】:

当我在家里做一个小测试服务器时,我也遇到了这个问题。域名解析为您的外部 IP 地址,并发送请求。但由于请求来自您的网络内部,路由器不会将其识别为正常请求。它可能有一个用于配置它的 Web 界面,并尝试从它自己的管理系统返回一个页面,然后在您指定的路径中找不到该页面。

在这种情况下,我在一台 Windows PC 上工作,我可以通过将我正在测试的域添加到我的 hosts 文件中来解决它,指定 127.0.0.1 作为 IP 地址(或服务器,如果它是同一网络中的另一台机器)。我认为在 Linux 中应该有类似的解决方案。

问题不在于 php 或您的服务器,而是您的路由器。

【讨论】:

这似乎是问题所在(在我的相同情况下),运行 echo gethostbyname('mydomain.com');从我的电脑 ping 得到了 2 个不同的 IP 地址【参考方案2】:

现在大多数主机提供阻止 furl_open 参数,该参数允许您使用 file_get_contents() 从外部 url 加载数据。

您可以使用CURL 或PHP 客户端库,例如Guzzle

【讨论】:

CURL 有同样的问题。在外部工作,在内部超时(两种情况下的 URL 相同)。【参考方案3】:

如果您只需要在找不到 URL 时处理警告(就像我一样),您可以这样做将 Warnings 变成 Exceptions

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();

基于此thread/question的解决方案。

【讨论】:

【参考方案4】:

尝试这样做:

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'));

【讨论】:

【参考方案5】:

我在 CodeIgniter 3 中遇到了同样的错误。我正在这样做file_get_contents(base_url('database.json')); 然后这个file_get_contents(site_url('database.json')); 我的问题在我改成这个后得到了解决file_get_contents(__DIR__.'/database.php'); 这背后的原因是,我试图从这些方法 base_url and site_url 返回的外部 url 获取内部资源。而__DIR__ 返回内部网址。

【讨论】:

以上是关于file_get_contents - 无法打开流:HTTP 请求失败! HTTP/1.1 404 未找到的主要内容,如果未能解决你的问题,请参考以下文章

file_get_contents(phar://../storage/logs/laravel.log/test.txt):无法打开流:phar 内部损坏

使用带有file_get_contents的FTP URL包装器时“无法打开流:操作失败”

knp_paginator 无法打开流

解码 json 无法打开流:HTTP 请求失败!错误

PHP - 无法打开流:没有这样的主机是已知的

PHP file_get_contents() 返回“打开流失败:HTTP 请求失败!”