С помощью PHP возможно ли отправлять заголовки HTTP с file_get_contents() ?
Я знаю, что вы можете отправить пользовательский агент из вашего php.ini файл. Тем не менее, вы также можете отправить другую информацию, такую как HTTP_ACCEPT , HTTP_ACCEPT_LANGUAGE , а также HTTP_CONNECTION с file_get_contents() ?
Или есть другая функция, которая выполнит это?
Содержание
- Решение
- Другие решения
- Описание
- Опции
- Список изменений
- Примеры
- Примечания
Решение
На самом деле, после дальнейшего чтения на file_get_contents() функция:
Возможно, вы сможете следовать этой схеме, чтобы достичь того, чего вы хотите, хотя я лично не проверял это. (и если это не работает, не стесняйтесь проверить мой другой ответ)
Другие решения
Вот что сработало для меня (у Доминика была всего одна строчка).
Вы можете использовать эту переменную для получения заголовков ответов после file_get_contents() функция.
Использование библиотек php cURL, вероятно, будет правильным решением, так как эта библиотека имеет больше возможностей, чем простая file_get_contents(. ) ,
При вызове file_get_contents по URL-адресу следует использовать функцию stream_create_context, которая довольно хорошо документирована на php.net.
Это более или менее точно описано на следующей странице php.net в разделе комментариев пользователей: http://php.net/manual/en/function.stream-context-create.php
Если вам не нужен HTTPS и curl недоступен в вашей системе, вы можете использовать fsockopen
Эта функция открывает соединение, из которого вы можете как читать, так и писать, как если бы вы использовали обычный дескриптор файла.
Опции контекста HTTP — Список опций контекста HTTP
Описание
Опции контекста для транспортных протоколов http:// и https://.
Опции
GET , POST или любой другой метод HTTP, поддерживаемый удаленным сервером.
По умолчанию GET .
Дополнительные заголовки для отправки вместе с запросом. Значения в этой опции будут переопределять другие значения (такие как User-agent:, Host: и Authentication:).
Значение для отправки вместе с заголовком User-Agent:. Это значение будет использоваться, если заголовок user-agent не был указан в опции контекста header выше.
По умолчанию используется значение директивы user_agent из файла php.ini .
Дополнительные данные для отправки после заголовков. Обычно используется с запросами POST и PUT.
URI, указывающий адрес прокси-сервера. (Например, tcp://proxy.example.com:5100).
Когда установлено в TRUE , весь URI будет использован при формировании запроса. (Например, GET http://www.example.com/path/to/file.html HTTP/1.0). Хотя это нестандартный формат запроса, некоторые прокси-серверы требуют его.
По умолчанию FALSE .
Следовать переадресациям заголовка Location. Для отключения установите в значение 0.
Максимальное количество переадресаций, которым можно следовать. Значение 1 или меньше означает, что никаких переадресаций не будет произведено.
По умолчанию 20.
Версия протокола HTTP.
В PHP до версии 5.3.0 не было реализовано декодирование фрагментированных передач. Если это значение установлено в 1.1, на вас лежит ответственность, чтобы было соответствие версии 1.1.
Тайм-аут на чтение в секундах, указанный с помощью типа float (например, 10.5).
По умолчанию используется значение директивы default_socket_timeout из файла php.ini .
Извлечь содержимое даже при неуспешных статусах завершения.
По умолчанию FALSE .
Список изменений
Примеры
Пример #1 Извлечь страницу и отправить данные методом POST
= http_build_query (
array(
‘var1’ => ‘некоторое содержимое’ ,
‘var2’ => ‘doh’
)
);
$opts = array( ‘http’ =>
array(
‘method’ => ‘POST’ ,
‘header’ => ‘Content-type: application/x-www-form-urlencoded’ ,
‘content’ => $postdata
)
);
$context = stream_context_create ( $opts );
$result = file_get_contents ( ‘http://example.com/submit.php’ , false , $context );
Пример #2 Игнорировать переадресации, но извлечь заголовки и содержимое
$opts = array( ‘http’ =>
array(
‘method’ => ‘GET’ ,
‘max_redirects’ => ‘0’ ,
‘ignore_errors’ => ‘1’
)
);
$context = stream_context_create ( $opts );
$stream = fopen ( $url , ‘r’ , false , $context );
// информация о заголовках, а также
// метаданные о потоке
var_dump ( stream_get_meta_data ( $stream ));
// актуальная информация по ссылке $url
var_dump ( stream_get_contents ( $stream ));
fclose ( $stream );
?>
Примечания
Замечание: Опции контекста низлежащего потока в сокете
Дополнительные опции контекста могут поддерживаться низлежащим транспортным протоколом. Для потоков http://, это относится к опциям контекста для транспортного протокола tcp://. Для потоков https://, это относится к опциям контекста для транспортного протокола ssl://.
Замечание: Строка статуса HTTP
Когда эта обертка потока следует по переадресации, wrapper_data, возвращаемый функцией stream_get_meta_data() , необязательно содержит строку статуса HTTP, которая на самом деле относится к содержанию данных по индексу 0.
Первый запрос вернул код 301 (постоянное перенаправление), так что обертка потока автоматически последовала этому перенаправлению, чтобы получить ответ 200 (индекс = 4).
Есть страница test с таким кодом:
На страницу test2 я передаю контент страницы test как:
Результат от передачи контента на любом браузере, в том числе на EDGE, всегда получается «Другой браузер»
Если я открываю страницу test напрямую при условии использования EDGE отображает Edge, при использовании других браузеров отображает Другой браузер. Тоесть код отрабатывает.
Как реализовать с передачей на страницу test2?
Источник: