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, и я все еще получаю ту же проблему.
Ответы
Ответ 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();
Решение основано на этой теме/вопросе.