- Header в PHP: что это такое, зачем нужно и как работает
- Как это работает
- Главные параметры функции header() в PHP
- Есть ли альтернатива функции header()?
- Назначение и возможности функции header() в PHP
- Примеры
- Заключение
- Header() in PHP – Refresh (Redirect) to Location (URL) in X seconds
- Case 1 : Redirect a page to a URL without waiting in PHP.
- Case 2 : Redirect a page to an URL after waiting for X seconds in PHP.
- Bonus Tip 1: HTML code to redirect a webpage after X seconds.
- Bonus Tip 2: Javascript code to redirect a webpage after X seconds.
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 проекта в портфолио.
Header() in PHP – Refresh (Redirect) to Location (URL) in X seconds
Recently, I was designing a simple user system for one of my websites. Obviously, it had login and logout feature. Now when I designed the login page, on a successful login, I wanted the user to be redirected to index page without displaying any kind of message. Whereas when I designed the logout page, I wanted the page to display “Logged out successfully” message for 5 seconds, then redirect to index page.
Now you can achieve this in HTML using the meta tag which I will be showing at the end of this tutorial, but if you wish to do this in PHP, it’s a little bit tricky. Following are the two cases and their solutions.
Case 1 : Redirect a page to a URL without waiting in PHP.
Say, after a successful login, you wish to redirect the user to index.php without waiting. Following is the code that can be used for the same :
Make sure that no text is sent to the browser before this part of the script is executed. Since header() is a function which is used to set “Headers” for a page when it is opened in a browser. In simpler words, when the browser starts receiving data from the server, it takes the header messages first and then the data that is supposed to be displayed. Now, if you send any data to be displayed, obviously you cannot send header messages any longer. So always make it a point to use PHP header() function before sending any kind of data to be displayed.
Case 2 : Redirect a page to an URL after waiting for X seconds in PHP.
Let us take the same example in the above scenario but let’s say that this time you wish to show a message saying logged in successfully, then wait for 5 seconds and redirect to index page. Here’s the code to do it :
Please note that I have used “echo” statement AFTER using “header()” function. I have briefly explained the logic behind this, in Case 1. If you use an echo statement or display any text before setting headers in a PHP page, the header function won’t work. So make sure you first set the headers and then use echo statement.
Bonus Tip 1: HTML code to redirect a webpage after X seconds.
Following is the code to redirect a webpage to an URL (for e.g. http://nimishprabhu.com) after, say, 5 seconds.
Just place the above code in the head section of the page i.e. after and before tag. This will refresh (redirect) a page to a specific URL after specified number of seconds.
Bonus Tip 2: Javascript code to redirect a webpage after X seconds.
If you would like to use Javascript for some reason, then you can use setTimeout() function to achieve similar result, provided user has Javascript enabled.
You will replace “https://nimishprabhu.com” with your URL and 5000 (5000 milliseconds i.e 5 seconds) with desired number of milliseconds to wait before redirecting the page.
Hope this article was useful. If you have any doubts, feel free to drop a comment using the form below.