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

时间:2012-03-05 21:18:17

标签: php 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'这是一个新的域名页面,因此当它从自己的服务器调用时,它就像查找正确的虚拟主机一样。

澄清(希望!):

在托管域名的服务器上:

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”

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但仍然遇到同样的问题。

4 个答案:

答案 0 :(得分:6)

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

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

问题不是PHP或您的服务器,而是您的路由器。

答案 1 :(得分:4)

现在,大多数托管服务都会屏蔽furl_open参数,该参数允许您使用file_get_contents()从外部网址加载数据。

您可以使用CURLPHP客户端库,例如Guzzle

答案 2 :(得分:1)

如果在未找到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的解决方案。

答案 3 :(得分:0)

尝试这样做:

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