php get headers from request
Как прочитать заголовок запроса в PHP
Как я должен читать любой заголовок в PHP?
14 ответов
если: вам нужен только один заголовок, вместо все заголовки, самый быстрый метод-это:
ТО ЕСЛИ: вы запускаете PHP как модуль Apache или, начиная с PHP 5.4, используя FastCGI (простой метод):
другое: в любом другом случае вы можете использовать (реализация userland):
к примеру X-Requested-With можно найти в:
начиная с PHP 5.4.0 вы можете использовать getallheaders функция, которая возвращает все запрошенные заголовки в виде ассоциативного массива:
ранее эта функция работала только тогда, когда PHP работал как модуль Apache/NSAPI.
strtolower отсутствует в нескольких предлагаемых решениях, RFC2616 (HTTP/1.1) определяет поля заголовка как объекты, нечувствительные к регистру. Все это, а не только стоимостью часть.
поэтому предложения, как только разбор соответствующий http_ записи неверны.
обратите внимание на тонкие различия с предыдущими предложениями. Функция здесь также работает на php-fpm (+nginx).
передать ключ заголовка эта функция вернет его значение вы можете получить значение заголовка с помощью for loop
чтобы сделать вещи простыми, вот как вы можете получить только один вы хотите:
или когда вам нужно получить по одному за раз:
я использовал CodeIgniter и использовал код ниже, чтобы получить его. Может пригодиться кому-то в будущем.
это выглядит намного проще, чем большинство примеров, приведенных в других ответах. Это также получает метод (GET/POST / etc.) и URI, запрошенный при получении всех заголовков, которые могут быть полезны, если вы пытаетесь использовать его в журнале.
get_headers
get_headers — Возвращает все заголовки из ответа сервера на HTTP-запрос
Описание
get_headers() возвращает массив с заголовками из ответа сервера на HTTP-запрос.
Список параметров
Если необязательный параметр associative установлен в ненулевое значение, get_headers() разберёт ответ сервера и установит ключи для возвращаемого массива.
Возвращаемые значения
Возвращает индексированный или ассоциативный массив с заголовками ответа или false при возникновении ошибки.
Список изменений
Примеры
Пример #1 Пример использования get_headers()
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Пример использования запроса HEAD в функции get_headers()
Смотрите также
User Contributed Notes 27 notes
If the URL redirected and the new target is also redirected, we got the Locations in array. Also we got the HTTP codes in a number indexed values.
array
(
[0] => HTTP/1.1 302 Moved Temporarily
[Location] => Array
(
[0] => /test.php?id=2
[1] => /test.php?id=3
[2] => /test.php?id=4
)
[1] => HTTP/1.1 302 Moved Temporarily
[2] => HTTP/1.1 302 Moved Temporarily
[3] => HTTP/1.1 200 OK
)
In a typical situation we need only the landing page information, so here is a small code to get it:
How to check if a url points to a valid video
I know you’re not supposed to reference other notes, but sincere props to Nick at Innovaweb’s comment, for which I base this addition to his idea:
If you use that function, it will return a string, which is great if you are checking for only files that return 404, or 200, or whatnot. If you cast the string value to an integer, you can perform mathematical comparison on it.
if( intval ( get_http_response_code ( ‘filename.jpg’ )) 400 ) <
// File exists, huzzah!
>
?>
Rule of thumb is if the response is less than 400, then the file’s there, even if it doesn’t return 200.
if the URL does not exist, it returns incomplete headers, making the substring default to rubbish.
The integer value of rubbish is always 0. So your lower than 400 does not always means it exists!
To check URL validity, this has been working nicely for me:
If you don’t want to display Warning when get_headers() function fails, you can simply add at-sign (@) before it.
// in failure, Warning will be hidden and false returned
$withoutWarning = @ get_headers ( «http://www.some-domain.com» );
// in failure, Warning displays and false will be returned, too
$withWarning = get_headers ( «http://www.some-domain.com» );
Note that get_headers should not be used against a URL that was gathered via user input. The timeout option in the stream context only affects the idle time between data in the stream. It does not affect connection time or the overall time of the request.
(Unfortunately, this is not mentioned in the docs for the timeout option, but has been discussed in a number of code discussions elsewhere, and I have done my own tests to confirm the conclusions of those discussions.)
If you are publishing your code, even default_socket_timeout cannot be relied on to remedy this, because it is broken for the HTTPS protocol on many but the more recent versions of PHP: https://bugs.php.net/bug.php?id=41631
With get_headers accepting user input, it can be very easy for an attacker to make all of your PHP child processes become busy.
Instead, use cURL functions to get headers for a URL provided by the user and parse those headers manually, as CURLOPT_TIMEOUT applies to the entire request.
hey, i came across this afew weeks ago and used the function in an app for recording info about domains that my company owns, and found that the status this returns was wrong most of the time (400 bad request or void for sites that were clearly online). then looking into it i noticed the problem was that it wasn’t able to get the correct info about sites with redirections. but thats not the full problem because everything on my server was returning the wrong status too. i searched around on php.net for other info and found that fsockopen’s example worked better and only needed some tweeking.
heres the function i put together from it and a small change.
hope this’ll help someone else.
It should be noted that rather than returning «false» on failure, this function (and others) return a big phat WARNING that will halt your script in its tracks if you do not have error reporting /warning turned off.
Thats just insane! Any function that does something like fetch a URL should simply return false, without a warning, if the URL fails for whatever reason other than it is badly formatted.
The following code dose NOT work with PHP version 7.0.26 with my server.
Some other setting may be required?
Tried with website pages and path to local files.
The word ‘Finished’ is printed only.
Should be the same than the original get_headers():
I’ve noticed it.
Some Server will simply return the false reply header if you sent ‘HEAD’ request instead of ‘GET’. The ‘GET’ request header always receiving the most actual HTTP header instead of ‘HEAD’ request header. But If you don’t mind for a fast but risky method then ‘HEAD’ request is better for you.
aeontech, this the below change adds support for SSL connections. Thanks for the code!
I found that this function is the slowest in obtaining the headers of a page probably because it uses a GET request rather then a HEAD request. Over 10,000,000 trials of obtaining the headers of a page from a server i found the following (results in seconds).
cURL: Mean: 0.584127946. Sigma: 0.050581736.
fsocketopen: Mean: 0.622114251. Sigma: 0.263170424.
get_headers: Mean: 0.90375551. Sigma: 0.273823419.
cURL was the fastest with fsocketopens being the second fastest. I noticed as well that fsocketopen had some outliers where as cURL did not.
In some cases, you don’t want get_headers to follow redirects. For example, some of my servers can access a particular website, which sends a redirect header. The site it is redirected to, however, has me firewalled. I need to take the 302 redirected url, and do something to it to give me a new url that I *can* connect to.
The following will give you output similar to get_headers, except it has a timeout, and it doesn’t follow redirects:
Testing the validity of a URL that is preceded by one or more server redirects is tricky. There will be more than one status code returned and all but the first will be redirect codes.
This function will return an integer containing the three digit status code of the last code returned, which is what you want.
return (int) substr($value, strpos($value, ‘ ‘, 8) + 1, 3);
>
If getHeaders() fails, PHP will throw an error. Test the return value for === false.
/**
* Fetches all the real headers sent by the server in response to a HTTP request without redirects
*
* @link http://php.net/function.get_headers
* @link http://bugs.php.net/bug.php?id=50719
*/
For anyone reading the previous comments, here is code that takes into account all the previous suggestions and includes a bugfix, too.
In response to dotpointer’s modification of Jamaz’ solution.
if(! function_exists ( ‘get_headers’ )) <
Unfortunately there is still no useful output format to handle redirects.
This function will bring all non-broken headers into a usable format. Too bad it has to call the get_headers() funtion 2 times, but i dont see any other possibility right now.
Content-Type returns a value depending only on the extension and not the real MIME TYPE.
apache_request_headers
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
apache_request_headers — Получает список всех заголовков HTTP-запроса
Описание
Получает список всех заголовков HTTP текущего запроса. Работает на веб-серверах Apache и FastCGI.
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Ассоциативный массив, содержащий все HTTP-заголовки текущего запроса, или false в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
7.3.0 | Эта функция стала доступна в SAPI FPM. |
Примеры
Пример #1 Пример использования apache_request_headers()
Результатом выполнения данного примера будет что-то подобное:
Примечания
Смотрите также
User Contributed Notes 5 notes
I didn’t found a replacement for apache_request_headers() in PHP::Compat (http://pear.php.net/package/PHP_Compat) so I wrote my own:
Although we expect to see headers in mixed case, the standard RFC2616 demands that «field names are case-insensitive». PHP delivers the headers exactly untouched in whatever way the client sent them. Potentially you should expect to get any type of uppercase or lowercase or mixed.
Thus, if you want to be standards compliant, you must loop through every key and check it in a case-insensitive manner, instead of doing the obvious thing and using the name of the header as an array index.
The headers are then available in PHP as
[ ‘HTTP_IF_MODIFIED_SINCE’ ];
$_SERVER [ ‘HTTP_IF_NONE_MATCH’ ];
?>
I’ve tested this on PHP/5.1.6, on both Apache/2.2.3/Win32 and Apache/2.0.54/Unix, and it works perfectly.
Note: if you use RewriteRules already for clean URLs, you need to put the above rules AFTER your existing ones.
A slightly modified version from limalopex.eisfux.de. Fixes the missing Headers Content-Type and Content-Length and makes it Camel-Case.
Протокол HTTP и работа с заголовками
Протокол HTTP
Как работает WWW (всемирная паутина, веб) в двух словах:
Иными словами, весь современный веб построен на модели клиент-серверного взаимодействия. И чтобы весь этот процесс оказался возможным, необходим универсальный язык-протокол, который будет понимать и сервер, и браузер. Такой протокол есть, а называется он HTTP.
Как работает HTTP, и зачем нам это знать
Программировать на PHP можно и без знания протокола HTTP, но есть ряд ситуаций, когда для решения задач нужно знать, как именно работает веб-сервер. Ведь PHP — это, в первую очередь, серверный язык программирования.
Протокол HTTP очень прост и состоит, по сути, из двух частей:
Сначала идёт список заголовков, затем пустая строка, а затем (если есть) тело запроса/ответа.
И клиент, и сервер могут посылать друг другу заголовки и тело ответа, но в случае с клиентом доступные заголовки будут одни, а с сервером — другие. Рассмотрим пошагово, как будет выглядеть работа по протоколу HTTP в случае, когда пользователь хочет загрузить главную страницу социальной сети «Вконтакте».
1. Браузер пользователя устанавливает соединение с сервером vk.com и отправляет следующий запрос:
2. Сервер принимает запрос и отправляет ответ:
3. Браузер принимает ответ и показывает готовую страницу
Больше всего нам интересен самый первый шаг, где браузер инициирует запрос к серверу vk.com
Рассмотрим подробнее, что там происходит. Первая строка запроса определяет несколько важных параметров, а именно:
GET — это метод (глагол), который мы применяем для доступа к указанной странице.
GET является самым часто используемым методом, потому что он говорит серверу о том, что клиент всего лишь хочет прочитать указанный документ. Но помимо GET есть и другие методы, один из них мы рассмотрим уже в следующем разделе.
Больше всего здесь интересен именно код состояния, он же код ответа сервера.
В этом примере код ответа — 200, что означает: сервер работает, документ найден и будет передан клиенту. Но не всегда всё идет гладко.
Например, запрошенный документ может отсутствовать или сервер будет перегружен, в таком случае клиент не получит контент, а код ответа будет отличным от 200.
Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.
После стартовой строки следуют заголовки, а затем тело ответа.
Работа с заголовками в PHP
В PHP есть все возможности для взаимодействия с протоколом HTTP:
Разберём всё по порядку.
Получение тела запроса
Получение заголовков запроса
Пример, как получить предыдущую страницу, с которой перешёл пользователь:
Добавление/изменение заголовков ответа
В PHP-сценарии можно управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы. Это возможно, потому что PHP работает на стороне веб-сервера и имеет с ним очень тесную интеграцию.
Вот примеры сценариев, когда пригодится управление заголовками ответа:
Управление телом ответа
Параметры запроса
На сайте дневника наблюдений за погодой мы сделали отдельную страницу, чтобы показывать на ней информацию о погоде из истории за один конкретный день. То есть страница одна, но показывает разные данные, в зависимости от выбранного дня.
Также пользователи хотят добавить в закладки адреса страниц с нужными им днями. Получается, что имея только один сценарий сделать страницу, способную показывать дневник погоды за любой день невозможно? Вовсе нет!
Из чего состоит URI
URI — это уникальный идентификатор ресурса. Ресурс в нашем случае — это полный путь до страницы сайта. И вот как может выглядеть ресурс для показа погоды за конкретный день:
http://weather-diary.ru/day.php?date=2017-10-15
В примере выше указывается два аргумента: дата и единица измерения температуры.
Параметры запроса как внешние переменные
Теперь в адресе страницы используются параметры запроса, но какая нам от этого польза? Она состоит в том, что если имя страницы вызывает к исполнению соответствующий PHP-сценарий, то параметры запроса превращаются в специальные внешние переменные в этом сценарии. То есть, если в адресе присутствуют такие параметры, то их легко получить внутри кода сценария и выполнить с ними какие-нибудь действия. Например, показать погоду за конкретный день в выбранных единицах измерения.
Получение параметров запроса
Формирование URI с параметрами запроса
Иногда нужно совершить обратную операцию: сформировать адрес страницы, включив туда нужные параметры запроса из массива.
Скажем, на странице погодного дневника надо поставить ссылку на следующий и предыдущий день. Нужно также сохранить выбранную единицу измерений. То есть необходимо сохранить текущие параметры запроса, поменять значение одного из них (день), и сформировать новую ссылку.
Вот как это можно сделать:
Здесь мы использовали две функции:
Как отправить или получить HTTP заголовки запроса (браузера или другого клиента) на PHP
HTTP заголовки отправляются практически всегда, при каждом запросе любой веб-страницы. Они позволяют сообщить браузеру или другому клиенту информацию о выдаваемом контенте, могут содержать ряд настроек. Известно, что заголовки бывают двух типов:
Как отправить HTTP заголовки запроса
Это можно сделать, если используется свой клиент для запроса на сервер. Например, это может быть простой запрос при помощи библиотеки CURL:
Также надо сказать, что у библиотеки CURL есть свои предопределенные константы, которые читаются сервером как заголовки. Например, можно отправить HTTP заголовок User-Agent или другие при помощи подобного кода:
Как получить HTTP заголовки запроса
Получить заголовки может понадобиться для разных целей, для этого используются специальные возможности языков программирования. Для получения заголовков в PHP есть несколько функций. Ниже приводятся функции для получения заголовков на PHP:
Для получения заголовков можно использовать любую функцию. Часто применяется функция getallheaders:
Как видно из статьи, работать с HTTP заголовками довольно просто, для этого достаточно использовать специальные средства языка программирования PHP.