Php вывести все заголовки запроса

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

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

  • request headers — заголовки запроса, посылаются клиентом (браузером) на сервер;
  • response headers — заголовки ответа, посылаются сервером клиенту (в браузер).

В этой статье рассматриваются заголовки первого типа — заголовки запроса.

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

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

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

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

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

  • getallheaders — возвращает все заголовки HTTP-запроса;
  • apache_request_headers — получает список всех заголовков HTTP-запроса.
Читайте также:  Как лучше чистить зубы утром до еды или после еды

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

Однако она работает не всегда, например, может возникнуть ошибка «Call to undefined function getallheaders()». Это означает, что функция не определена и необходимо использовать другие функции, либо обновить PHP. Перед использованием этой функции можно проверить существует ли она – функцией function_exists. Если никакая функция не сработает – можно выбрать все заголовки из массива $_SERVER, они помечаются префиксом «HTTP_».

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

Источник

Как вывести всю информацию из HTTP-запроса на экран в PHP

Мне нужен PHP-код, который делает дамп всей информации в HTTP-запросе, включая заголовки и содержимое любой информации, включенной в запрос POST. По сути, это диагностический инструмент, который выдает именно то, что я отправляю на сервер.

У кого-нибудь есть код, который это делает?

9 ответов

Это охватывает большинство входящих элементов: Руководство по PHP.net: $ _REQUEST

Чтобы получить все в том порядке, в котором вы хотите, и исключить переменные, которые вам не интересны, но которые должны дать вам начало, потребуется немного массировать.

Что ж, вы можете полностью прочитать тело POST вот так

И, предполагая, что ваш веб-сервер — Apache, вы можете прочитать заголовки запросов как так что

Никто не упомянул, как правильно сбрасывать HTTP-заголовки при любых обстоятельствах.

Из спецификации CGI rfc3875, раздел 4.1.18:

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

Объединение ответов от Питера Бейли и Cmyker вы получите что-то вроде:

Который работает со встроенным веб-сервером php -S , что является весьма удобной функцией PHP.

Если вам нужны настоящие HTTP-заголовки (как запрос, так и ответ), попробуйте hurl.it.

Вы можете использовать команду PHP apache_request_headers() , чтобы получить заголовки запроса и apache_response_headers() , чтобы получить текущие заголовки ответа. Обратите внимание, что ответ может быть изменен позже в сценарии PHP, пока контент не обслуживается.

File_get_contents (‘php: // input’) не всегда будет работать.

У меня есть запрос с заголовками «content-length = 735» и «php: // input» — это пустая строка. Так что зависит от того, насколько хорош / действителен HTTP-запрос.

Проблема заключалась в том, что в URL-адресе я написал http: // my_domain вместо https: // my_domain

Кроме того, вы можете использовать get_headers (). это не зависит от apache ..

Источник

getallheaders

(PHP 4, PHP 5, PHP 7, PHP 8)

getallheaders — Возвращает все заголовки HTTP-запроса

Описание

Возвращает все заголовки для текущего HTTP-запроса.

Эта функция является псевдонимом функции apache_request_headers() . Пожалуйста, обратитесь к описанию функции apache_request_headers() для получения детальной информации о её работе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив, содержащий все HTTP-заголовки для данного запроса или false в случае возникновения ошибок.

Список изменений

Версия Описание
7.3.0 Эта функция стала доступна в SAPI FPM.

Примеры

Пример #1 Пример использования getallheaders()

foreach ( getallheaders () as $name => $value ) <
echo » $name : $value \n» ;
>

Смотрите также

  • apache_response_headers() — Возвращает список всех HTTP-заголовков ответа Apache

User Contributed Notes 7 notes

it could be useful if you using nginx instead of apache

if (! function_exists ( ‘getallheaders’ ))
<
function getallheaders ()
<
$headers = [];
foreach ( $_SERVER as $name => $value )
<
if ( substr ( $name , 0 , 5 ) == ‘HTTP_’ )
<
$headers [ str_replace ( ‘ ‘ , ‘-‘ , ucwords ( strtolower ( str_replace ( ‘_’ , ‘ ‘ , substr ( $name , 5 )))))] = $value ;
>
>
return $headers ;
>
>
?>

A simple approach to dealing with case insenstive headers (as per RFC2616) is via the built in array_change_key_case() function:

$headers = array_change_key_case(getallheaders(), CASE_LOWER);

There’s a polyfill for this that can be downloaded or installed via composer:

dont forget to add the content_type and content_lenght if your are uploading file:

function emu_getallheaders () <
foreach ( $_SERVER as $name => $value )
<
if ( substr ( $name , 0 , 5 ) == ‘HTTP_’ )
<
$name = str_replace ( ‘ ‘ , ‘-‘ , ucwords ( strtolower ( str_replace ( ‘_’ , ‘ ‘ , substr ( $name , 5 )))));
$headers [ $name ] = $value ;
> else if ( $name == «CONTENT_TYPE» ) <
$headers [ «Content-Type» ] = $value ;
> else if ( $name == «CONTENT_LENGTH» ) <
$headers [ «Content-Length» ] = $value ;
>
>
return $headers ;
>
?>

chears magno c. heck

apache_request_headers replicement for nginx

if (! function_exists ( ‘apache_request_headers’ )) <
function apache_request_headers () <
foreach( $_SERVER as $key => $value ) <
if ( substr ( $key , 0 , 5 )== «HTTP_» ) <
$key = str_replace ( » » , «-» , ucwords ( strtolower ( str_replace ( «_» , » » , substr ( $key , 5 )))));
$out [ $key ]= $value ;
>else <
$out [ $key ]= $value ;
>
>
return $out ;
>
>
?>

Источник

Протокол HTTP и работа с заголовками

Протокол HTTP

Как работает WWW (всемирная паутина, веб) в двух словах:

  • браузер пользователя (клиент) отправляет на сервер запрос с адресом сайта (URL);
  • сервер получает этот запрос и отдаёт клиенту требуемый тому контент.

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

Как работает HTTP, и зачем нам это знать

Программировать на PHP можно и без знания протокола HTTP, но есть ряд ситуаций, когда для решения задач нужно знать, как именно работает веб-сервер. Ведь PHP — это, в первую очередь, серверный язык программирования.

Протокол HTTP очень прост и состоит, по сути, из двух частей:

  • Заголовков запроса/ответа;
  • Тела запроса/ответа.

Сначала идёт список заголовков, затем пустая строка, а затем (если есть) тело запроса/ответа.

И клиент, и сервер могут посылать друг другу заголовки и тело ответа, но в случае с клиентом доступные заголовки будут одни, а с сервером — другие. Рассмотрим пошагово, как будет выглядеть работа по протоколу HTTP в случае, когда пользователь хочет загрузить главную страницу социальной сети «Вконтакте».

1. Браузер пользователя устанавливает соединение с сервером vk.com и отправляет следующий запрос:

2. Сервер принимает запрос и отправляет ответ:

3. Браузер принимает ответ и показывает готовую страницу

Больше всего нам интересен самый первый шаг, где браузер инициирует запрос к серверу vk.com
Рассмотрим подробнее, что там происходит. Первая строка запроса определяет несколько важных параметров, а именно:

  • Метод, которым будет запрошен контент;
  • Адрес страницы;
  • Версию протокола.

GET — это метод (глагол), который мы применяем для доступа к указанной странице.
GET является самым часто используемым методом, потому что он говорит серверу о том, что клиент всего лишь хочет прочитать указанный документ. Но помимо GET есть и другие методы, один из них мы рассмотрим уже в следующем разделе.

После метода идет указание на адрес страницы — URI (универсальный идентификатор ресурса). В нашем случае мы запрашиваем главную страницу сайта, поэтому используется просто слэш — / .
Последним в этой строке идет версия протокола и почти всегда это будет HTTP/1.1

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

Сервер, получив запрос, ищет у себя сайт с доменом из заголовка Host , а также указанную страницу.
Если запрошенный сайт и страница найдены, клиенту отправляется ответ:
HTTP/1.1 200 OK
Такой ответ означает, что всё хорошо, документ найден и будет отправлен клиенту. Если говорить более обобщённо, стартовая строка ответа имеет следующую структуру:
HTTP/Версия Код состояния Пояснение

Больше всего здесь интересен именно код состояния, он же код ответа сервера.
В этом примере код ответа — 200, что означает: сервер работает, документ найден и будет передан клиенту. Но не всегда всё идет гладко.
Например, запрошенный документ может отсутствовать или сервер будет перегружен, в таком случае клиент не получит контент, а код ответа будет отличным от 200.

  • 404 — если сервер доступен, но запрошённый документ не найден;
  • 503 — если сервер не может обрабатывать запросы по техническим причинам.

Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.

После стартовой строки следуют заголовки, а затем тело ответа.

Работа с заголовками в PHP

В PHP есть все возможности для взаимодействия с протоколом HTTP:

  • Получение тела запроса;
  • Получение заголовков запроса;
  • Добавление/изменение заголовков ответа;
  • Управление телом ответа.

Разберём всё по порядку.

Получение тела запроса

Тело запроса — это информация, которую передал браузер при запросе страницы.
Но тело запроса присутствует только если браузер запросил страницу методом POST .
Дело в том, что POST — это метод, специально предназначенный для отправки данных на сайт. Чаще всего метод POST браузер задействует в момент отправки формы. В этом случае телом запроса будет содержимое формы.

В PHP-сценарии все данные отправленной формы будут доступны в специальном массиве $_POST . Более подробно об этом написано в следующей главе, посвящённой формам.

Получение заголовков запроса

Напомним ещё раз, что заголовки запроса — это мета-информация, отправленная браузером при запросе сценария.
PHP автоматически извлекает такие заголовки и помещает их в специальный массив — $_SERVER .
Стоит отметить, что в этом массиве, помимо заголовков, есть и другая информация. Значения заголовков запроса находятся под ключами, которые начинаются с HTTP_ . Подробно всё содержимое этого массива описано в официальной документации.

Пример, как получить предыдущую страницу, с которой перешёл пользователь:

Добавление/изменение заголовков ответа

В PHP-сценарии можно управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы. Это возможно, потому что PHP работает на стороне веб-сервера и имеет с ним очень тесную интеграцию.
Вот примеры сценариев, когда пригодится управление заголовками ответа:

  • Кэширование;
  • Переадресация пользователя;
  • Установка cookies;
  • Отправка файлов;
  • Передача дополнительной информации браузеру.

Заголовки ответа нужны для выполнения множества важных задач.
В PHP есть функция для отправки или смены заголовков: header() .
Она принимает имя и значение заголовка и добавляет его в список из всех заголовков, которые уйдут в браузер пользователя после окончания работы сценария.
Например, так выполняется перенаправление пользователя на другую страницу:

За переадресацию отвечает заголовок с именем Location , а через двоеточие задаётся значение — адрес страницы для перехода.

Важное замечание по использованию заголовков
Есть одно ограничение: заголовки нельзя отправлять, если пользователю к этому моменту уже отправили любой контент. То есть, если показать что-то на экране, например, через функцию print() , то после этого заголовки поменять уже не получится.

Управление телом ответа

Всё, что PHP выводит на экран, является содержимым ответа. Иными словами, вызовы функций print , echo или показ текста через шорт-теги являются телом ответа, которое попадает в браузер пользователю.

Параметры запроса

Мы привыкли, что на нашем сайте каждый PHP-сценарий отвечает за одну страницу. Посетитель сайта вводит в адресную строку путь, который состоит из имени домена и имени PHP-сценария. Например, так: http://weather-diary.ru/day.php .
Но как быть, если одна страница должна показывать разную информацию?

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

Из чего состоит URI

URI — это уникальный идентификатор ресурса. Ресурс в нашем случае — это полный путь до страницы сайта. И вот как может выглядеть ресурс для показа погоды за конкретный день:
http://weather-diary.ru/day.php?date=2017-10-15

Разберем, из чего состоит этот URI.
Во-первых, здесь есть имя домена: weather-diary.ru .
Затем идёт имя сценария: day.php
А всё что идёт после — это параметры запроса.

Параметры запроса — это как бы дополнительные атрибуты адреса страницы. Они отделяются от имени страницы знаком запроса. В примере выше параметр запроса только один: date=2017-10-30.
Имя этого параметра: date , значение: 2017-10-15 .
Параметров запроса может быть несколько, тогда они разделяются знаком амперсанда: ?date=2017-10-15&tscale=celsius

В примере выше указывается два аргумента: дата и единица измерения температуры.

Параметры запроса как внешние переменные

Теперь в адресе страницы используются параметры запроса, но какая нам от этого польза? Она состоит в том, что если имя страницы вызывает к исполнению соответствующий PHP-сценарий, то параметры запроса превращаются в специальные внешние переменные в этом сценарии. То есть, если в адресе присутствуют такие параметры, то их легко получить внутри кода сценария и выполнить с ними какие-нибудь действия. Например, показать погоду за конкретный день в выбранных единицах измерения.

Получение параметров запроса

Если есть внешние переменные, то как их прочитать?
Все параметры запроса находятся в специальном, ассоциативном массиве $_GET , а значит сценарий, вызванный с таким адресом: day.php?date=2017-10-15&tscale=celsius будет иметь в этом массиве два значения с ключами date и scale .
Запрос на получение данных за выбранный день выглядит так:

В первой строчке примера выше мы получаем значение параметра date , а если он отсутствует, то используем текущую дату в качестве выбранного дня.
Никогда не полагайтесь на существование параметра в массиве $_GET и делайте проверку либо функцией isset() , либо как в этом примере.

В этом задании вы сможете потренироваться использовать $_GET .

Формирование URI с параметрами запроса

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

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

  • basename(__FILE__) — получает имя текущего сценария;
  • http_build_query() — преобразует ассоциативный массив в строку запроса.

Источник

Оцените статью