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 时处理警告(就像我一样),您可以这样做将
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 内部损坏