Header в PHP: что это такое, зачем нужно и как работает
Функция header() в PHP используется для отправки клиенту заголовка HTTP-ответа. Без нее невозможно представить современный интернет и веб. HTTP-заголовки позволяют обмениваться дополнительной информацией в цепочке клиент-сервер. Такой заголовок включает в себя название и значение для него (название не чувствительно к регистру символов). Header как функция обязательно должна вызываться первой, иначе возникнут ошибки.
Простыми словами, header() в PHP — это функция отправки HTTP-заголовка.
Как это работает
Функция header() в PHP служит для нескольких целей. Самые частые:
1. Перенаправления клиента на другую страницу.
2. Изменение типа содержимого страницы.
void header( $header_name, $replace_param = TRUE, $http_response_code ) $header_name является обязательным полем и передает строку заголовка для отправки
Когда клиент запрашивает страницу с какого-то сервера, он обязательно посылает HTTP-запрос. Этот запрос содержит строку запроса (Request-Line), показывающую, какое действие нужно выполнить по URL (например, GET /index.html). Также HTTP-запрос включает в себя заголовки запроса. Эти заголовки, в свою очередь, содержат различную информацию о самом запросе — временные метки, кодировки символов и другие данные.
Самые популярные HTTP-запросы
Аналогично, когда какое-то серверное приложение отвечает на запрос, оно отправляет тело ответа (например, HTML-страницу или JSON-компонент) вместе с заголовками. Опять же, эти заголовки содержат разнообразную информацию — она отличается от приложения к приложению, от сервера к серверу, хотя есть несколько ключевых моментов, которые можно смело назвать стандартными.
Функция header() позволяет установить поля и значения заголовков, которые будут переданы клиенту в ответе.
Представим, что все запросы проходят через скрипт index.php (загрузчик). Так функционирует, например, WordPress и почти каждый PHP-фреймворк сегодня. Далее — загрузчик анализирует строку URI и определяет, существует ли содержимое. Если такого содержимого нет — ответ будет включать в себя ошибку 404, например.
Изменение типа содержимого страницы
При этом всегда нужно задействовать корректные коды ответа сервера: если выводится страница «Not Found», но с кодом ответа HTTP 200, то такая страница будет бесполезной для краулеров поисковых систем (ведь использован некорректный код ответа — 200). Так что, обязательно обращайте внимание на код ответа:
header("HTTP/1.0 404 Not Found");
Создание редиректа
Другим примером использования функции header() можно назвать создание редиректа (перенаправления клиента на другую страницу). Такое перенаправление может быть полезным в разных сценариях, например, в случае отправки формы. Стандартный сценарий: форма отправляет содержимое на свой собственный URI или на себя, затем проверяется ввод на серверной стороне. Если все ОК — происходит редирект на дальнейшую страницу (например, на страницу благодарности). Таким образом, мы защищены от дублирования ввода (благодаря обновлению):
header('Location: Example Domain');
Важно: вызов header() должен быть выполнен до того, как PHP обработает любое содержимое, которое будет отправлено клиенту. Это касается всего, включая невидимые пробелы и пустые строки!
Первым делом отправляются сами заголовки, и если в вывод затесался какой-нибудь пробел, вы не сможете выполнить header() — вы уже отправили заголовок и теперь отправляете тело ответа. Решить эту проблему не так сложно: просто не используйте закрывающий символ ?> в PHP-файлах. Интерпретатор динамически определит подходящий конец файла, устраняя возможность проскочить пробел, когда активируется запрос нескольких файлов.
Функция PHP header() используется для отправки необработанного («сырого» или raw) HTTP-заголовка.
Главные параметры функции header() в PHP
В функцию header() могут быть переданы три аргумента.
1. header. Обязательный параметр. Указывает строку заголовка для отправки.
2. replace. Опциональный параметр. Указывает, должен ли заголовок заменить предыдущий аналогичный заголовок или добавить новый заголовок аналогичного типа. По умолчанию используется TRUE — в этом случае заголовок будет заменен. Указание FALSE позволяет использовать несколько заголовков одного типа. Replace — необязательный аргумент булевого типа, позволяющий передавать друг за другом несколько однотипных заголовков. Взгляните на этот пример:
3. http_response_code. Необязательный параметр, принудительно устанавливающий код HTTP-ответа. Этот параметр стал доступен в версиях PHP, начиная с версии 4.3.
Функция header(), напомним, используется для отправки клиенту необработанного («сырого») заголовка. Поэтому она должна быть вызвана еще до отправки любого другого вывода. Распространенная ошибка — включение в PHP-скрипт функций include или require, считывающих код, в котором могут быть пустые строки или пробелы — они выведутся до вызова header(). Указанная опасность присутствует и при использовании PHP / HTML в одном файле.
Разные параметры в ответе / запросе заголовка
Возвращаемые значения: функция header() не возвращает никаких значений. Заголовки могут быть двух типов (первый — стартует строкой «HTTP/», которая используется для определения кода состояния HTTP).
Есть ли альтернатива функции header()?
Напомним, что функция header() служит для двух целей: перенаправления на другую страницу или изменение типа содержимого страницы. Предположим, что вы ищете альтернативу для перенаправления страницы. Здесь есть несколько способов, например, вы можете задействовать отдельный JavaScript-код на клиенте:
window.location.href="куда вы хотите перенаправить".
Если у вас возникла проблема с выводом содержимого при использовании функции header(), то изучите тему буферизации вывода в PHP.
Для организации редиректа внутри PHP-кода вместо использования функции header() можно прибегнуть к средствам JavaScript. Возможны два варианта редиректа на нужную страницу:
- Установить значение свойства window.location.href. При этом пользователь сможет вернуться на предыдущую страницу.
- Установить значение свойства window.location.replace. При этом предыдущая страница не сохранится в истории документа. Это означает, что пользователь не сможет нажать кнопку «Назад» для перехода на предыдущую страницу.
Вы можете использовать вышеуказанные возможности JavaScript следующим образом:
// window.location.href: if ($have_to_redirect) < echo «„; > // window.location.replace: if ($have_to_redirect) < echo “»; >
Назначение и возможности функции header() в PHP
Основное назначение HTTP-заголовков очевидно — без них привычное функционирование цепочки клиент-сервер будет невозможно представить. Вот еще несколько причин применения header() для задания HTTP-заголовков:
- Заголовки позволяют осуществлять перенаправление по адресу в строке URI.
- Заголовки могут быть использованы для передачи браузеру как типа ответа, так и типа содержимого.
Примеры
Мы подготовили несколько разных примеров использования header() в PHP. Посмотрите на них внимательно, чтобы в будущем не столкнуться с типичными проблемами.
Отправка трех HTTP-заголовков с целью отмены кэширования страниц:
Отправка пользователю запроса на сохранение созданного PDF-файла:
Обратите внимание: заголовок Content-Disposition используется для указания рекомендуемого имени файла и заставляет браузер отобразить диалоговое окно сохранения.
Перенаправить браузер на другую страницу совсем нетрудно:
header('Location: http://www.example.com/');
Посмотрите, как можно настроить директивы кэширования:
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 (да, 1.1:) header("Expires: Mon, 24 Jun 1998 05:00:00 GMT"); // Какая-то дата в прошлом
В приведенном ниже примере мы будет применять HTTP-заголовки для кэширования передаваемого изображения, что позволяет экономить пропускную способность:
Сначала мы берем изображение и проверяем, не было ли оно уже закэшировано. Если кэш клиента является актуальным, мы с помощью header() возвращаем HTTP-код 304 (Нет необходимости повторно передавать запрошенные ресурсы). Если изображения нет в кэше, то мы выводим его в теле HTTP-ответа и устанавливаем заголовок Last-Modified для дальнейшего кэширования на стороне клиента.
Пример 8 (простой).
Теперь посмотрим, как можно редиректить пользователя с соответствующим уведомлением:
В этом примере мы покажем, как использовать определенные прокси-серверы и клиенты для отключения кэширования PHP. Зачем отключать такое кэширование? PHP часто создает динамическое содержимое, которое не должно кэшироваться браузером или другими прокси-кэшами (если они расположены в цепочке сервер-браузер). Вот каким образом мы можем решить эту задачу:
Иногда страницы не будут кэшироваться — даже в тех случаях, когда вышеупомянутые строки и заголовки не включены в PHP-код. Причина: пользовательские настройки. Существует множество опций, которые пользователь может установить для своего браузера, что фактически изменяет поведение кэширования по умолчанию.
Так может выглядеть вывод нашего примера выше:
Используя вышеупомянутые заголовки, мы сможем отменить все настройки, которые могут привести к кэшированию вывода PHP-скрипта
Существует также параметр для автогенерации корректных заголовков, связанных с кэшированием, когда используются различные сессии. Называется этот параметр — session.cache_limiter.
Заключение
HTTP-заголовок или хедер является важной частью каждого документа, поскольку он сообщает браузеру, что это за документ и как его читать. Без заголовка браузер не смог бы корректно прочитать и разобрать документ.
Функция header() в PHP отвечает за предоставление необработанных HTTP-заголовков браузерам, а также за редирект браузеров на другие страницы.
Запомнить: перед header() не допускается какой-то другой код (включая пустые строки или теги HTML). Функция может быть вызвана только в том случае, если передача информации клиенту ещё не проводилась.
За 6 недель вы освоите работу с главными инструментами современного backend разработчика и получите 3 проекта в портфолио.