php прочитать заголовок ответа

Как отправить или получить HTTP заголовки запроса (браузера или другого клиента) на PHP

HTTP заголовки отправляются практически всегда, при каждом запросе любой веб-страницы. Они позволяют сообщить браузеру или другому клиенту информацию о выдаваемом контенте, могут содержать ряд настроек. Известно, что заголовки бывают двух типов:

php прочитать заголовок ответа. Смотреть фото php прочитать заголовок ответа. Смотреть картинку php прочитать заголовок ответа. Картинка про php прочитать заголовок ответа. Фото php прочитать заголовок ответа

Как отправить HTTP заголовки запроса

Это можно сделать, если используется свой клиент для запроса на сервер. Например, это может быть простой запрос при помощи библиотеки CURL:

Также надо сказать, что у библиотеки CURL есть свои предопределенные константы, которые читаются сервером как заголовки. Например, можно отправить HTTP заголовок User-Agent или другие при помощи подобного кода:

Как получить HTTP заголовки запроса

Получить заголовки может понадобиться для разных целей, для этого используются специальные возможности языков программирования. Для получения заголовков в PHP есть несколько функций. Ниже приводятся функции для получения заголовков на PHP:

Для получения заголовков можно использовать любую функцию. Часто применяется функция getallheaders:

Как видно из статьи, работать с HTTP заголовками довольно просто, для этого достаточно использовать специальные средства языка программирования PHP.

Источник

Протокол 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 с параметрами запроса

Иногда нужно совершить обратную операцию: сформировать адрес страницы, включив туда нужные параметры запроса из массива.
Скажем, на странице погодного дневника надо поставить ссылку на следующий и предыдущий день. Нужно также сохранить выбранную единицу измерений. То есть необходимо сохранить текущие параметры запроса, поменять значение одного из них (день), и сформировать новую ссылку.
Вот как это можно сделать:

Здесь мы использовали две функции:

Источник

Откуда берется заголовок Content-Type: nginx + php-fpm

Rocket science не будет. Если вы используете php-fpm, то скорее всего в связке с nginx. Простой вопрос: как в PHP получить значения HTTP заголовков запроса клиента?

Как в PHP получить значения HTTP заголовков входящего запроса?

Согласитесь звучит не очень обнадеживающе? Складывается ощущение, что это переменные Шрёдингера. На странице документации приводится ответ на первый вопрос.

Ок, вроде бы всё просто, хоть на странице документации и не сказано про CONTENT_TYPE (правда есть небольшая подсказка комментария 2013 года), попробуем получить значение по аналогии.

К сожалению, такого ключа в массиве нет.

Ну да ладно, давайте посмотрим спецификацию CGI/1.1.

4.1.3. CONTENT_TYPE
If the request includes a message-body, the CONTENT_TYPE variable is
set to the Internet Media Type [6] of the message-body.

There is no default value for this variable. If and only if it is
unset, then the script MAY attempt to determine the media type from
the data received. If the type remains unknown, then the script MAY
choose to assume a type of application/octet-stream or it may reject
the request with an error (as described in section 6.3.3).

The server MUST set this meta-variable if an HTTP Content-Type field
is present in the client request header. If the server receives a
request with an attached entity but no Content-Type header field, it
MAY attempt to determine the correct content type, otherwise it
should omit this meta-variable.

Мы узнали ответ на второй вопрос.

Перейдём к 3-му вопросу, продолжив чтение спецификации.

4.1.18. Protocol-Specific Meta-Variables

The server SHOULD set meta-variables specific to the protocol and
scheme for the request. Interpretation of protocol-specific
variables depends on the protocol version in SERVER_PROTOCOL. The
server MAY set a meta-variable with the name of the scheme to a
non-NULL value if the scheme is not the same as the protocol. The
presence of such a variable indicates to a script which scheme is
used by the request.

Meta-variables with names beginning with «HTTP_» contain values read
from the client request header fields, if the protocol used is HTTP.
The HTTP header field name is converted to upper case, has all
occurrences of «-» replaced with «_» and has «HTTP_» prepended to
give the meta-variable name.
The header data can be presented as
sent by the client, or can be rewritten in ways which do not change
its semantics. If multiple header fields with the same field-name
are received then the server MUST rewrite them as a single value
having the same semantics. Similarly, a header field that spans
multiple lines MUST be merged onto a single line. The server MUST,
if necessary, change the representation of the data (for example, the
character set) to be appropriate for a CGI meta-variable.

The server is not required to create meta-variables for all the
header fields that it receives. In particular, it SHOULD remove any
header fields carrying authentication information, such as
‘Authorization’; or that are available to the script in other
variables, such as ‘Content-Length’ and ‘Content-Type’.
The server
MAY remove header fields that relate solely to client-side
communication issues, such as ‘Connection’.

А вот и ответ на 3-ий вопрос.

Допустим мы решили поднять nginx + php-fpm через docker-compose

Примерно так будет выглядеть nginx конфиг app.conf

php прочитать заголовок ответа. Смотреть фото php прочитать заголовок ответа. Смотреть картинку php прочитать заголовок ответа. Картинка про php прочитать заголовок ответа. Фото php прочитать заголовок ответа.

И последний вопрос: Как остальные HTTP заголовки, например User-Agent попадают от nginx к php-fpm?

Всё просто, документация nginx даёт ответ.

Parameters Passed to a FastCGI Server

HTTP request header fields are passed to a FastCGI server as parameters. In applications and scripts running as FastCGI servers, these parameters are usually made available as environment variables. For example, the “User-Agent” header field is passed as the HTTP_USER_AGENT parameter. In addition to HTTP request header fields, it is possible to pass arbitrary parameters using the fastcgi_param directive.

Заметьте, здесь сказано, что HTTP заголовки передаются в приложение как HTTP_*. Но на самом деле два заголовка Content-Type и Content-Length, передаются по другому. Я бы назвал это ошибкой документации, но в ней есть слово usually, поэтому не будем придираться.

Выводы

2) Я не знаю причину почему CGI выделил логику заголовков Content-Type/Content-Length. Возможно, для этого была весомая причина. Но результатом является куча неправильного кода программистов.

Например, на stackoverflow советуют вот так получить все HTTP заголовки

Как не сложно заметить, заголовки Content-Type/Content-Length данный код не вернет. При этом ответ имеет 350+ лайков.

Похожий код можно найти и в документации php

Источник

Как прочитать заголовок любого запроса в PHP

Как читать заголовок в PHP?

ЕСЛИ : вам нужен только один заголовок, а не все заголовки, самый быстрый способ:

ELSE IF : вы запускаете PHP как модуль Apache или, как и PHP 5.4, используя FastCGI (простой метод):

ELSE: В любом другом случае вы можете использовать (пользовательскую реализацию):

См. Также :
getallheaders () – (PHP> = 5.4) межплатформенная версия Псевдоним apache_request_headers() apache_response_headers () – выборки всех HTTP-заголовков ответов.
headers_list () – выбор списка заголовков для отправки.

Например, ваш X-Requested-With можно найти в:

Начиная с PHP 5.4.0 вы можете использовать функцию getallheaders которая возвращает все запрошенные заголовки как ассоциативный массив:

Ранее эта функция работала только тогда, когда PHP работал как модуль Apache / NSAPI.

Обратите внимание на тонкие отличия от предыдущих предложений. Функция здесь также работает на php-fpm (+ nginx).

Передайте ключ заголовка, эта функция вернет свое значение, вы можете получить значение заголовка без использования цикла for

Чтобы все было просто, вот как вы можете получить только тот, который вам нужен:

или когда вам нужно получить по одному:

Мне это намного проще, чем большинство примеров, приведенных в других ответах. Это также получает метод (GET / POST / etc.) И запрашиваемый URI при получении всех заголовков, которые могут быть полезны, если вы пытаетесь использовать его при регистрации.

Вот простой способ сделать это.

Я использую эту функцию для получения пользовательских заголовков, если заголовок начинается с «HTTP_X_», мы вставляем массив 🙂

Я использовал CodeIgniter и использовал код ниже, чтобы получить его. Может быть полезным для кого-то в будущем.

Этот небольшой фрагмент PHP может быть вам полезен:

Источник

Как прочитать заголовок запроса в 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, запрошенный при получении всех заголовков, которые могут быть полезны, если вы пытаетесь использовать его в журнале.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *