Функция PHP header_remove(): всё, что нужно знать
Функция header_remove() в PHP позволяет удалять HTTP-заголовки из исходящего ответа до их отправки клиенту. Узнайте синтаксис и типичные случаи применения.
Каждый PHP-ответ содержит набор HTTP-заголовков — метаданные, которые браузер читает ещё до того, как получит содержимое страницы (тип контента, правила кэширования, куки, перенаправления и т. д.). Иногда вы устанавливаете заголовок в начале скрипта, а затем решаете, что его не нужно отправлять. header_remove() — это встроенная функция, которая убирает заголовок из исходящего ответа до его отправки клиенту.
В этой главе рассматриваются синтаксис, необязательный параметр, условия работы функции и типичные сценарии её использования.
Что делает header_remove()
header_remove() удаляет заголовок, ранее поставленный в очередь через header() (или автоматически добавленный PHP), из списка заголовков, которые будут отправлены вместе с ответом. Поскольку PHP буферизует заголовки до начала потоковой передачи тела ответа, вы можете свободно добавлять и удалять их вплоть до этого момента.
Функция работает со списком исходящих заголовков, а не с заголовками запроса, полученными скриптом от браузера.
Синтаксис
header_remove(?string $name = null): void$name— имя удаляемого заголовка (без учёта регистра, без двоеточия и значения), например"X-Powered-By". Параметр необязателен. Если его опустить (или передатьnull), будут удалены все установленные на данный момент заголовки.- Возвращаемое значение — отсутствует (
void).
Удаление одного заголовка
<?php
header("X-MyHeader: Hello World!");
header_remove("X-MyHeader");Здесь заголовок X-MyHeader ставится в очередь, а затем удаляется, поэтому браузер его так и не получит. Имя заголовка сопоставляется без учёта регистра, поэтому header_remove("x-myheader") удалит тот же заголовок.
Удаление всех заголовков
Вызовите функцию без аргументов, чтобы очистить все заголовки, поставленные в очередь:
<?php
header("X-First: 1");
header("X-Second: 2");
header_remove(); // both X-First and X-Second are droppedЭто также очищает заголовки, которые PHP добавляет автоматически (например, X-Powered-By, если он включён), что является одним из наиболее распространённых практических применений — скрыть информацию о сервере до начала вывода.
Условия работы
Заголовки можно изменять только до отправки каких-либо данных вывода. Как только первый байт тела покидает скрипт — через echo, print, пробельный символ перед <?php или закрывающий тег ?> с последующей пустой строкой — заголовки отправляются и блокируются.
Используйте headers_sent(), чтобы проверить, можно ли ещё изменять заголовки, и headers_list(), чтобы просмотреть текущую очередь заголовков:
<?php
header("X-Debug: on");
if (!headers_sent()) {
header_remove("X-Debug");
}
print_r(headers_list()); // X-Debug is no longer in the listЕсли вывод уже начался, header_remove() ничего не сделает, и PHP выдаст предупреждение «headers already sent» — точно так же, как это делает header().
Типичные случаи применения
- Скрытие отпечатка сервера. Удалите
X-Powered-By, чтобы ответы не раскрывали версию PHP. - Отмена условного заголовка. Поставьте заголовок кэширования или перенаправления в начале, а затем удалите его, если более позднее условие изменит логику.
- Сброс перед чистым перенаправлением. Очистите лишние заголовки перед выдачей нового
header("Location: ...").
Заключение
header_remove() даёт точный контроль над исходящим HTTP-ответом: передайте имя, чтобы удалить один заголовок, или вызовите функцию без аргументов, чтобы очистить все. Используйте её в паре с headers_sent() и headers_list(), чтобы изменять заголовки только пока это разрешено, и вы сможете уверенно управлять тем, что получает браузер.