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

问题描述 投票:0回答:6

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

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

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

我有一种感觉,这可能与一台服务器上有两个 IP 和两个不同的 ssl 证书有关,当我从服务器获取服务器的 file_get_contents /(索引页)时,我得到 plesk '这是一个新域'页面,所以它就像 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未找到”

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

php file-get-contents
6个回答
6
投票

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

在这种情况下,我正在 Windows PC 上工作,我可以通过将我正在测试的域添加到我的

hosts
文件中来解决这个问题,并将 127.0.0.1 指定为 IP 地址(或服务器的 IP 地址) ,如果它是同一网络内的另一台机器)。我想在Linux中应该有类似的解决方案。

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


6
投票

如果您只需要在找不到 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();

基于此线程/问题的解决方案。


5
投票

大多数托管服务现在都会阻止

furl_open
参数,该参数允许您使用
file_get_contents()
从外部 URL 加载数据。

您可以使用 CURL

PHP
客户端库,例如 Guzzle


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

0
投票

我在 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__
返回内部 url。


0
投票

对于 Laravel Dusk

对于在 114 之后的 Chrome/Chromium 版本的 Laravel Dusk 上遇到此问题的任何人,这可能是由 Google 更改上游 URL 引起的。

这似乎已经在这个黄昏问题中得到解决,所以理论上正确解决这个问题所需的只是一个

composer require laravel/dusk --with-all-dependencies
,但至少在我的情况下,这会更新很多的依赖关系,并且似乎很有可能破坏我的应用程序。我曾就这个问题询问过,对于旧版 Laravel 应用程序(我的例子是 Laravel 8),最好的做法是什么,但与此同时 将 Chrome/Chromium 浏览器和 Chrome 驱动程序降级到 v114 应该就足够了解决方法

这说起来容易做起来难,我花了一天多的时间才弄清楚如何在 GitHub Actions 上成功完成此操作,但是将以下步骤添加到您的工作流程文件应该是让您的构建再次运行所需的全部内容:

  - name: Downgrade Chrome browser to v114
    uses: browser-actions/setup-chrome@latest
    with:
      chrome-version: 1134343 # Last commit number for Chrome v114
  - run: CHROME_BIN=$(which chrome)
  - name: Downgrade Chrome driver to v114
    run: php artisan dusk:chrome-driver 114
© www.soinside.com 2019 - 2024. All rights reserved.