Подтвердить что ты не робот

File_get_contents - не удалось открыть поток: HTTP-запрос не удался! HTTP/1.1 404 не найден

У меня возникают некоторые странные проблемы с файлом_get_contents после перемещения моего сайта в новый домен. Я должен был создать новый домен и IP-адрес (используя Plesk), чтобы получить новый сертификат ssl. Теперь мой файл_get_contents, вызывающий script в том же домене, дает мне следующее:

не удалось открыть поток: HTTP-запрос не удался! HTTP/1.1 404 не найден

Если я нахожу тот же URL-адрес с помощью file_get_contents на другом сервере, он отлично работает, и если я вызываю www.google.com с сервера, который не работает, значит, это похоже, если я вызываю URL-адрес на том же сервере

У меня есть ощущение, что это может иметь какое-то отношение к двум IP-адресам с двумя разными сертификатами ssl на одном сервере, когда я 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 не найден"

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, и я все еще получаю ту же проблему.

4b9b3361

Ответ 1

У меня тоже была эта проблема, когда я работал на небольшом тестовом сервере дома. Имя домена разрешено для вашего внешнего IP-адреса и отправляется запрос. Но поскольку запрос поступает из вашей сети, маршрутизатор не распознает его как обычный запрос. Он, вероятно, имеет веб-интерфейс для его настройки и пытается вернуть страницу из своей собственной системы управления, которая затем не найдена по указанному вами пути.

В этом случае я работал на ПК с ОС Windows, и я смог его решить, добавив домен, который я тестировал, в мой hosts файл, указав 127.0.0.1 в качестве IP-адреса (или IP-адрес сервер, если это другой компьютер в той же сети). Думаю, в Linux должно быть похожее решение.

Проблема не в PHP или на вашем сервере, а в вашем маршрутизаторе.

Ответ 2

Большинство хостов теперь блокируют параметр furl_open, который позволяет вам использовать file_get_contents() для загрузки данных с внешнего URL-адреса.

Вы можете использовать CURL или клиентскую библиотеку PHP, такую ​​как Guzzle

Ответ 3

Попробуйте сделать это:

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

Ответ 4

Если вам просто нужно обработать предупреждение, когда 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();

Решение основано на этой теме/вопросе.