header — отправляет HTTP-заголовок


Содержание

Отправка сырого HTTP-заголовка. PHP функция header

Отправка сырого HTTP-заголовка. PHP функция header

header — отправляет сырой HTTP-заголовок.

Описание

Помните, что функция header() должна вызываться до любой другой директивы, например обычного тега HTML, пустой строки в файле или PHP-формы. Очень часто встречается ошибка, когда перед функцией header() вызываются функции include(), require() или другие функции для доступа к файлам, или вставляются пустые строки и пробелы. Эта же проблема появляется, при использовании единых файлов PHP/HTML. Пример
/* Этот код вернет ошибку, т.к. до вызова header() встречается тег HTML*/
header ( ‘Location: http://www.example.com/’ );
?>

Параметры

Возможны два варианта вызова функции header(). Первый вариант — вызов функции со строкой (параметр string) «HTTP» (регистр не имеет значения), которая укажет код HTTP статуса. Например, если Вы в Apache сконфигурировали PHP-скрип для обработки ошибки типа «запрашиваемый файл не найден» (директива ErrorDocument), то у Вас есть возможность убедиться, что Ваш скрипт генерирует правильный код статуса.

( «HTTP/1.0 404 Not Found» );
?>

Второй вариант вызова — использование в заголовке строки «Location:». В этом случае функция не только возвращает заголовок в браузер, но и возвращает код статуса REDIRECT (302), если уже не установлен код 201 или 3xx

( «Location: http://www.example.com» ); /* Перенаправление браузера */

/* Убедитесь, что последующий код не выполняется после перенаправления*/
exit;
?>

Необязательный параметр replace (замена) определяет надо ли заменить предыдущий похожий заголовок или добавить следующий того же типа. По умолчанию заголовок будет заменен. Однако, если Вы передадите значение FALSE, то можете создать несколько заголовков одного типа. Например:

( ‘WWW-Authenticate: Negotiate’ );
header ( ‘WWW-Authenticate: NTLM’ , false );
?>

Принудительная установка значения HTTP код ответа.

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

Функция не возвращает никакие значения.

Хронология изменений

Версия Описание
4.4.2 и 5.1.2 Устранена возможность отправки нескольких заголовков за раз, это позволило повысить защиту от инъекционных атак (injection attacks)
4.3.0 Добавлен параметр http_response_code
4.0.4 Добавлен параметр replace

Примеры

Пример #1 Диалог загрузки

Если вы хотите сообщить пользователю, какого типа данные отправляете (например сгенерированный PDF файл ), то можете использовать заголовок Content-Disposition, в котором будут указаны предлагаемое имя файла и команда браузеру отрисовать диалог сохранения файла.

//Высылается файл PDF
header ( ‘Content-type: application/pdf’ );

//Файл будет назван downloaded.pdf
header ( ‘Content-Disposition: attachment; filename=»downloaded.pdf»‘ );

//Исходный PDF файл называется original.pdf
readfile ( ‘original.pdf’ );
?>

Пример #2 Кэширование директив

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

( «Cache-Control: no-cache, must-reval >); // HTTP/1.1
header ( «Expires: Sat, 26 Jul 1997 05:00:00 GMT» ); //Дата в прошлом
?>

Примечание: Вы можете обнаружить, что Ваши страницы не кэшруются даже если Вы не выполнили приведенные выше функции. Пользователь может поменять настройки браузера и таким образом изменить работу механизма кэширования. Отправив приведенные выше заголовки, вы перекроете любые настройки, которые могут управлять кэшированием страниц.
И еще пара слов. Если используются сессии, с помощью конфигурационных параметров session_cache_limiter() и session.cache_limiter можно настроить корректную генерацию кэш-ориентированных заголовков.

Примечания

Примечание: Строка HTTP статуса заголовка всегда первой посылается клиенту, независимо от того является ли вызов header() первым или нет. Пока HTTP заголовки не установлены статус может быть изменен вызовом header() с новой строкой статуса.

Примечание: Если Вы устанавливаете WWW-Authenticate заголовок (используете HTTP Authentication) и включен режим safe mode, то uid скрипта добавится в часть realm заголовка WWW-Authenticate.

/* Перенаправление на другую страницу в текущем каталоге*/
$host = $_SERVER [ ‘HTTP_HOST’ ];
$uri = rtrim ( dirname ( $_SERVER [ ‘PHP_SELF’ ]), ‘/’ );
$extra = ‘mypage.php’ ;
header ( «Location: http:// $host$uri / $extra » );
exit;
?>

Примечание: Session ID (ID сессии) не передается в заголовке Location даже если включен session.use_trans_sid. Session ID должен передаваться вручную, для этого надо использовать константу SID.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: , , ,
.

header

header — Отправка HTTP заголовка

Описание

header() используется для отправки HTTP заголовка. В » спецификации HTTP/1.1 есть подробное описание HTTP заголовков.

Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные. То есть она должна идти первой в выводе, перед ее вызовом не должно быть никаких HTML тэгов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require , в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header() . Те же проблемы могут возникать и при использовании одиночного PHP/HTML файла.

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

Существует два специальных заголовка. Один из них начинается с «HTTP/» (регистр не важен) и используется для отправки кода состояния HTTP. Например, если веб-сервер Apache сконфигурирован таким образом, чтобы запросы к несуществующим файлам обрабатывались средствами PHP скрипта (используя директиву ErrorDocument), вы наверняка захотите быть уверенными что скрипт генерирует правильный код состояния.

Для FastCGI синтаксис 404 кода несколько иной:

Другим специальным видом заголовков является «Location:». В этом случае фукнция не только отправляет этот заголовок броузеру, но также возвращает ему код состояния REDIRECT (302) (если ранее не был установлен код 201 или 3xx).

( «Location: http://www.example.com/» ); /* Перенаправление броузера */

/* Можно убедиться, что следующий за командой код не выполнится из-за
перенаправления.*/
exit;
?>

Необязательный параметр replace определяет, надо ли заменять предыдущий аналогичный заголовок или заголовок того же типа. По умолчанию заголовок будет заменен, но если передать FALSE , можно задать несколько однотипных заголовков. Например:

Принудительно задает код ответа HTTP. Следует учитывать, что это будет работать, только если строка string не является пустой.

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

Эта функция не возвращает значения после выполнения.

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

Версия Описание
4.4.2 и 5.1.2 Стало невозможно отправлять более одного заголовка за раз. Это сделано для защиты от атак, связанных с инъекцией заголовков.
4.3.0 Добавлен параметр http_response_code .
4.0.4 Добавлен параметр replace .

Примеры

Пример #1 Диалог загрузки

Если нужно предупредить пользователя о необходимости сохранить пересылаемые данные, такие как сгенерированный PDF файл, можно воспользоваться заголовком » Content-Disposition, который подставляет рекомендуемое имя файла и заставляет броузер показать диалог загрузки.

// Будем передавать PDF
header ( ‘Content-type: application/pdf’ );

// Который будет называться downloaded.pdf
header ( ‘Content-Disposition: attachment; filename=»downloaded.pdf»‘ );

// Исходный PDF файл original.pdf
readfile ( ‘original.pdf’ );
?>

Пример #2 Директивы для работы с кэшем

PHP скрипты часто генерируют динамический контент, который не должен кэшироваться клиентским броузером или какими-либо промежуточными обработчиками, вроде прокси серверов. Можно принудительно отключить кэширование на многих прокси серверах и броузерах, передав заголовки:

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

Дополнительно, для случаев когда используются сессии, можно задать настройки конфигурации session_cache_limiter() и session.cache_limiter. Эти настройки можно использовать для автоматической генерации заголовков управляющих кешированием.

Примечания

Доступ к заголовкам и их вывод будет осуществляться только в случае, если в используемом вами SAPI есть их поддержка.

Чтобы обойти эту проблему, можно буферизовать вывод скрипта. В этом случае все выводимые данные будут буферизоваться на сервере, пока не будет дана явная команда на пересылку данных. Управлять буферизацией можно вручную функциями ob_start() и ob_end_flush() , либо задав директиву output_buffering в конфигурационном файле php.ini , или же настроив соответствующим образом конфигурацию сервера.

Строка заголовка задающая состояние HTTP всегда будет отсылаться клиенту первой, вне зависимости от того был соответствующий вызов функции header() первым или нет. Это состояние можно перезаписать, вызывая header() с новой строкой состояния в любое время, когда можно отправлять HTTP заголовки.


В Microsoft Internet Explorer 4.01 есть баг, из-за которого это не работает. Обойти его никак нельзя. В Microsoft Internet Explorer 5.5 также есть этот баг, но его уже можно устранить установкой Service Pack 2 или выше.

Замечание: Если включен безопасный режим, то uid скрипта будет добавляться к realm части WWW-Authenticate заголовка (используется для HTTP аутентификации).

Спецификация HTTP/1.1 требует указывать абсолютный URI в качестве аргумента » Location:, включающий схему, имя хоста и абсолютный путь, хотя некоторые клиенты способны принимать и относительные URI. Абсолютный URI можно построить самостоятельно с помощью $_SERVER[‘HTTP_HOST’] , $_SERVER[‘PHP_SELF’] и dirname() :

ID сессии не будет передаваться вместе с заголовком Location, даже если включена настройка session.use_trans_sid. Его нужно передавать вручную, используя константу SID .

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

  • headers_sent() — Проверяет были ли и куда отправлены заголовки
  • setcookie() — Посылает cookie
  • http_response_code() — Получает или устанавливает код ответа HTTP
  • Раздел документации HTTP аутентификация

Как исправить ошибку «Заголовки уже отправлены» в PHP

836 Moses89 [2011-11-06 20:41:00]

При запуске my script я получаю несколько таких ошибок:

Предупреждение: невозможно изменить информацию заголовка — заголовки, уже отправленные (вывод запущен в /some/file.php:12) в /some/file.php на строка 23

Линии, упомянутые в сообщениях об ошибках, содержат header() и setcookie() .

Что может быть причиной этого? И как это исправить?

11 ответов

2703 Решение mario [2011-11-06 20:45:00]

Нет вывода перед отправкой заголовков!

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

Предупреждение: невозможно изменить информацию заголовка — уже отправленные заголовки (вывод начался с script: строка)

Некоторые функции, изменяющие HTTP-заголовок:

Вывод может быть:

  • Пробелы перед или после ?>
  • Обозначение порядка байтов UTF-8
  • Предыдущие сообщения об ошибках или уведомления
    • print , echo и другие функции, производящие вывод
    • Необработанные разделы, предшествующие .

Почему это происходит?

Чтобы понять, почему заголовки должны быть отправлены перед выходом, необходимо посмотреть типичный HTTP ответ. PHP-скрипты в основном генерируют HTML-контент, но также передают набор заголовков HTTP/CGI на веб-сервер:

Страница/вывод всегда следует за заголовками. PHP должен пройти сначала создайте заголовки на веб-сервере. Это может сделать только один раз. После двойной линии он никогда не может изменить их.

Когда PHP получает первый вывод ( print , echo , ), он будет очистить все собранные заголовки. Впоследствии он может отправить весь вывод он хочет. Но отправка последующих HTTP-заголовков невозможна.

Как узнать, где произошел преждевременный выход?

Предупреждение header() содержит всю соответствующую информацию для найти причину проблемы:

Предупреждение: невозможно изменить информацию заголовка — заголовки, уже отправленные (вывод начинается с/www/usr2345/htdocs/ auth.php: 52) в /www/usr 2345/htdocs/index.php в строке 100

Здесь «строка 100» относится к script, где не удалось выполнить вызов header() .

Заметка «вывод, начатая с» в круглой скобке более значительна. Он обозначает источник предыдущего вывода. В этом примере это auth.php и строка 52 . Это то, где вам приходилось искать преждевременный выход.

Печать, эхо

Преднамеренный вывод из операторов print и echo прекратится возможность отправлять HTTP-заголовки. Поток приложения должен быть реструктурированным, чтобы этого избежать. Используйте функции и схемы шаблонов. Убедитесь, что вызовы header() происходят до сообщений выписываются.

Функции, которые производят вывод, включают

  • print , echo , printf , vprintf
  • trigger_error , ob_flush , ob_end_flush , var_dump , print_r
  • readfile , passthru , flush , imagepng , imagejpeg

и т.д. и пользовательские функции.

Необработанные области HTML

Необработанные разделы HTML в файле .php также являются прямым выходом. Script должны быть отмечены условия, вызывающие вызов header() перед любыми необработанными блоками .

Используйте схему шаблонов, чтобы отделить обработку от логики вывода.

  • Обработать код обработки формы на скриптах поверх.
  • Используйте временные строковые переменные для отсрочки сообщений.
  • Фактическая логика вывода и смешанный вывод HTML должны соответствовать последним.

Пробелы перед для «script.php строка 1» предупреждения

Если предупреждение относится к выходу в строке 1 , то это в основном пробелы, текст или HTML перед открывающим токеном .

Аналогично это может произойти для добавленных скриптов или script разделов:

PHP на самом деле поглощает одну строку после тегов. Но это не будет компенсировать несколько новых строк или вкладок или пробелов, сдвинутых в такие промежутки.

Спецификация UTF-8

Одной из проблем может быть только односторонняя линия и пространство. Но есть и «невидимые» последовательности символов, которые могут вызвать это. Самый классный Спецификация UTF-8 (байт-заказ-марка)который не отображается большинством текстовых редакторов. Это байтовая последовательность EF BB BF , которая является необязательным и избыточным для кодированных документов UTF-8. Однако PHP должен лечить это как сырой выход. Он может отображаться как символы  на выходе (если клиент интерпретирует документ как латинский-1) или аналогичный «мусор».

В частности, графические редакторы и Java-IDE не обращают внимания на свои присутствие. Они не визуализируют его (обязаны стандартом Unicode). Однако большинство программистов и консольных редакторов:

Там легко понять проблему на ранней стадии. Другие редакторы могут идентифицировать его присутствие в меню файлов/настроек (Notepad ++ в Windows может идентифицировать и устранить проблему), Другой способ проверки присутствия BOM прибегает к hexeditor. В системах * nix hexdump обычно доступен, если не графический вариант, который упрощает проверку этих и других проблем:

Легкое исправление заключается в том, чтобы установить текстовый редактор для сохранения файлов как «UTF-8 (no BOM)» или подобная такая номенклатура. Зачастую новички прибегают к созданию новых файлы и просто скопировать и снова вставить предыдущий код.

Утилиты исправления

Существуют также автоматизированные инструменты для проверки и перезаписи текстовых файлов ( sed / awk или recode ). Для PHP специально существует phptags tag tidier. Он переписывает закрытые и открытые теги в длинные и короткие формы, но также легко исправляет начальные и конечные пробелы, проблемы с Unicode и UTF-x:

Это разумно использовать в целом include или каталог проекта.

Пробелы после ?>

Если источник ошибки упоминается как за закрытие ?> то здесь выписывается какой-то пропущенный или необработанный текст. Маркер конца PHP не завершает выполнение script при этом точка. Любые символы текста/пробела после того, как они будут выписаны как содержимое страницы до сих пор.

Общепринято, в частности, новичкам, что trailing ?> PHP теги close должны быть опущены. Это предотвращает небольшую часть этих случаев. (Чаще всего сценарии include()d являются виновниками.)

Источник ошибки, указанный как «Неизвестно в строке 0»

Обычно это расширение PHP или php.ini, если источник ошибок конкретизируется.

  • Иногда параметр настройки потока gzip или ob_gzhandler .
  • Но это может быть и любой загруженный в два раза модуль extension= генерирование неявного сообщения о запуске/предупреждении PHP.

Предыдущие сообщения об ошибках


Если другой оператор или выражение PHP вызывает предупреждение или уведомление распечатывается, что также считается преждевременным выходом.

В этом случае вам нужно избежать ошибки, задержать выполнение оператора или подавить сообщение, например. isset() или @() — когда либо не препятствует отладке позже.

Нет сообщения об ошибке

Если у вас error_reporting или display_errors отключено на php.ini , то предупреждение не появится. Но игнорирование ошибок не вызовет проблемы далеко. Заголовки по-прежнему не могут быть отправлены после преждевременного выхода.

Поэтому, когда header(«Location: . «) перенаправляет молча, рекомендуется проконтролировать предупреждения. Обозначить их двумя простыми командами на вызов script:

Или set_error_handler(«var_dump»); , если все остальное не работает.

Говоря о переадресации заголовков, вы должны часто использовать идиому вроде это для конечных путей кода:

Предпочтительно даже функция полезности, которая печатает сообщение пользователя в случае сбоев header() .

Буферизация вывода в качестве обходного пути

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

output_buffering= тем не менее, может помочь. Настройте его в php.ini или через . htaccess или даже . user.ini on современные установки FPM/FastCGI.
Включение этого режима позволит PHP выводить выходные данные вместо того, чтобы передавать его на веб-сервер мгновенно. Таким образом, PHP может собирать заголовки HTTP.

Он также может быть связан с вызовом ob_start(); на вершине вызова script. Это, однако, менее надежно по нескольким причинам:

Даже если запускает первый script, пробел или Спецификация может быть перетасована раньше, делает ее неэффективной.

Он может скрывать пробелы для вывода HTML. Но как только приложение логические попытки отправить двоичный контент (например, сгенерированное изображение), буферизованный посторонний выход становится проблемой. (Необходимость ob_clean() как предыдущий вариант.)

Буфер ограничен по размеру и может быть легко переполнен, если оставить его по умолчанию. И это не редкость, трудно отследить когда это произойдет.

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

См. также базовый пример использования в руководстве, и для большего количества плюсов и минусов:

Но он работал на другом сервере!?

Если вы не получили предупреждения заголовков раньше, то выходная буферизация Настройка php.ini изменилось. Вероятно, он не сконфигурирован на текущем/новом сервере.

Проверка с помощью headers_sent()

Вы всегда можете использовать headers_sent() , чтобы проверить, если все еще можно. отправить заголовки. Что полезно для условной печати информацию или применить другую резервную логику.

Полезные обходные пути:

HTML тег

Если ваше приложение структурно сложно исправить, тогда простое (но несколько непрофессиональный) способ разрешить переадресацию — это инъекция HTML-кода тег . Перенаправление может быть достигнуто с помощью:

Или с небольшой задержкой:

Это приводит к недействительному HTML, когда используется раздел . Большинство браузеров все еще принимают его.

Переадресация JavaScript

В качестве альтернативы JavaScript-перенаправление может использоваться для перенаправления страниц:

Хотя это часто более совместимо с HTML, чем обходное решение он берет на себя зависимость от клиентов, поддерживающих JavaScript.

Оба подхода, однако, делают приемлемые резервные копии, когда подлинный HTTP-заголовок() вызовы не выполняются. В идеале вы всегда должны сочетать это с удобным для пользователя сообщением и в качестве последней инстанции. (Например, это http_redirect() Расширение PECL делает.)

Почему setcookie() и session_start() также затронуты

Оба setcookie() и session_start() должны отправить HTTP-заголовок Set-Cookie: . Таким образом, применяются те же условия, и аналогичные сообщения об ошибках будут сгенерированы для случаев преждевременного выхода.

(Конечно, в браузере, кроме того, они подвержены воздействию файлов cookie, или даже проблемы с прокси. Функциональность сеанса, очевидно, также зависит от дисковое пространство и другие настройки php.ini и т.д.)

Дальнейшие ссылки

  • Google предоставляет длинный список подобных обсуждений.
  • И, конечно, многие конкретные случаи были также рассмотрены в переполнении стека.
  • В WordPress часто задаются вопросы Как решить проблему, уже отправленную предупреждением? в общем виде.
  • Сообщество Adobe: PHP-разработка: почему перенаправления не работают (уже отправленные заголовки)
  • Часто задаваемые вопросы о нуклеусе: Что означает «заголовки страниц уже отправлены» ?
  • Одним из более подробных объяснений является HTTP-заголовки и функция заголовка PHP() — учебник NicholasSolutions (ссылка на интернет-архив). Он подробно описывает HTTP и дает несколько рекомендаций по переписыванию скриптов.

179 phihag [2011-11-06 20:44:00]

Это сообщение об ошибке запускается, когда что-либо отправляется перед отправкой заголовков HTTP (с setcookie или header ). Общие причины вывода чего-либо перед заголовками HTTP:

Случайные пробелы, часто в начале или в конце файлов, например:

Чтобы избежать этого, просто оставьте закрытие ?>

  • Значения байтов байтов в начале php файла. Изучите ваши php файлы с помощью шестнадцатеричного редактора, чтобы узнать, является ли этот случай. Они должны начинаться с байтов 3F 3C . Вы можете безопасно удалить спецификацию EF BB BF с начала файлов.
  • Явный вывод, например вызовы echo , printf , readfile , passthru , код до и т.д.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить настройки display_errors или error_reporting, вы должны решить проблему.
    Обычными причинами являются доступ к элементам undefined массива (например, $_POST[‘input’] без использования empty или isset , чтобы проверить, установлен ли вход) или с помощью константы undefined вместо строкового литерала (как в $_POST[input] , обратите внимание на недостающие кавычки).

Включение буферизация вывода должно устранить проблему; все выходные данные после вызова ob_start буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush .

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

Я получил эту ошибку много раз раньше. И я уверен, что все программисты PHP по крайней мере однажды получили эту ошибку. Чтобы решить эту проблему, вы можете решить использовать решение в соответствии с уровнем вашей проблемы:

Возможное решение 1:

Возможно, вы оставили пробелы до или после (в конце файла после?>), Т.е.

Большая часть времени это должно решить ваш problem.Do проверить все файлы, связанные с файлом вам require .

Примечание. Иногда EDITOR (IDE), например gedit (стандартный Linux-редактор), добавляет одну пустую строку в файл save save. Этого не должно быть. Если вы используете linux. вы можете использовать редактор VI для удаления пробела/строк после?> в конце страницы.

Если это не ваше дело, тогда вы можете использовать ob_start для буферизации вывода, как показано ниже:

Возможное решение 2:

Это приведет к буферизации вывода, и ваши заголовки будут созданы после буферизации страницы.

Заголовки HTTP через PHP

Для тех, кто только начинает изучать PHP — заголовки HTTP является каким-то туманом, который почему-то не особо приятный. давайте его рассеивать. Любой начинающий программист должен уметь с ними работать.

Вообще нужно сказать, что заголовки HTTP используются для общения между браузером и веб-сервером. То есть один говорить в каком формате принимает, другой в каком передает.

В PHP для передачи заголовков используется функция header() — основное внимание ей.

vo > header ( string string [, bool replace [, int http_response_code]] )

. — главное — перед этой функцией(то есть перед отправкой заголовков) — не должно стоять ни пробелов, ни других html тегов, иначе будет ошибка!

1) Вообще их можно узнать через функцию: var_dump(getallheaders());


Узнать операционку пользователя и версию браузера можно так:

$headers = getallheaders();
echo $headers[‘User-Agent’];

Но чаще пользуются суперглобальным массивом $_SERVER для этих нужд.

2) А узнать то, что отправили можно так, через функцию headers_list():

header(«Человек: это звучит гордо!»);
var_dump(headers_list());

1) Для переадрессации на другой сайт. Вы скорее всего видели в своей жизни неоднократно, заходишь на свой сайт, а он перекидывает тебя на другой, так вот это и есть применение заголовков таким образом:

header( ‘Location: http://saitsozdanie.ru/’ );

или перекинь меня пожалуйста, через 5 секунд после захода:

header( ‘Refresh: 5; url=http://saitsozdanie.ru/’ ); (то же самое но с помощью html тегов )

2) Для установки кодировки сайта:

header(‘Content-Type: text/html; charset=utf-8’);

или тоже самое html тегом:

Основная боязнь у новичков — именно от незнания, то в одном виде видят, то в другом. Так вот знайте, что можно и так и так! Все должно стать легче!)

3) Для отработки ошибок:

//Страница выполнена корректно
header( ‘HTTP/1.1 200 OK’ );
//Запрашиваемая страница не найдена
header( ‘HTTP/1.1 404 Not Found’ );
//Доступ запрещен:
header( ‘HTTP/1.1 403 Forbidden’ ); //Страница перемещена навсегда.
//Используется для корректировки урлов поисковых серверов.
header( ‘HTTP/1.1 301 Moved Permanently’ );
//Сервер выполнил скрипт с ошибкой
header( ‘HTTP/1.1 500 Internal Server Error’ );

4) Установка типа контента — что мы передаем рисунок — это одно, если pdf файл — то другой заголовок и тд:

header(‘Content-Type: text/plain’); // plain text файл
header(‘Content-Type: image/jpeg’); // JPG картинка в формате
header(‘Content-Type: audio/mpeg’); // Audio MPEG (MP3. ) файл
header(‘Content-Type: application/x-shockwave-flash’); // Flash animation

5) Когда последний раз изменялось содержимое контента:

header( ‘Last-Modified: ‘.gmdate( ‘D, d M Y H:i:s’, ( time() — 60 ) ).’ GMT’ );

6) Заголовок на PHP для отключения кэширования:

header( ‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’ );
header( ‘Expires: Mon, 1 Apr 2001 01:02:03 GMT’ );
header( ‘Pragma: no-cache’ );

header( ‘Content-language: en’ ); // en = English

Также заголовки используются:

Более новые статьи:

  • Часто используемые функции php я решил выносить в отдельные статьи. потому что запросы обычно бывают именно целевые, то есть люди ищут именно ответ н …

«>Parse_url () функция — 22/03/2020 21:06
Часто возникает вопрос: «Как убрать копейки из цены на php?» на него и будет отвечать в этой статье на примере одной cms. …

«>Как убрать копейки из цены на php — 14/03/2020 10:10
Без соединения с базой данных (БД) сегодня не работает практически ни один сайт. поэтому и мы рассмотрим как соединяться с MySQL при помощи php. …

Более старые статьи:

  • Часто в PHP нужно вывести все файлы и каталоги в виде списка. это нужно, чтобы нам сразу узнать где у нас, чего и сколько. давайте приступать. …

«>PHP вывод файлов и каталогов директории
На PHP часто нужна загрузка файлов на сервер. приятно же, если у вашего сайта есть возможность загружать файлы на сайт: картинки или другие текстовые …

«>PHP Загрузка файлов на сервер
В PHP часто приходится иметь дело с созданием файла. все очень просто нет файла на диске, код прогнался и файл появился, далее можно считать этот фай …

Можно ли отдать ответ в заголовке header http?

1. на php что бы слушать сокет нужно создать сервер, а это тонна накладных расходов, задача отслеживать падения, отслеживать ресурсы и так далее — по этому я сразу сказал что это не простая задача и весь эффект может невилироваться.
2. с другой стороны если решить вопрос надёжности — появляется так же и постоянная память и сохранение контекста и прочие возможности запущенного приложения по сравнению с постоянно запускаемым и умираемым скриптом — но это уже очень сложная задача в рамках PHP, многие, кстати, её решают в той или иной степени в продакшине
3. http это тоже сетевой протокол
4. подсчёт символов даст вам ответ — есть ли польза от того что бы исключить тело ответа и ограничиться заголовками — вот тут вам уже точно нужно читать спецификацию протокола http и понять что разницы между заголовками и телом ответа нет никакого, и там и там текст, только заголовки в начале, а тело ответа в конце и между ними два перевода корретки и в общем-то вот и вся разница
5. curl — это библиотека которая работает с сокетом. убирая curl вы убираете прослойку, но все важные для бизнеса вещи (авторедирект, восстановления соединения, докачка и так далее) вам придётся дописать самому в зависимости от задачи.

Резюмируем:
— если задача сделать самый быстрый запрос и самый быстрый ответ
— если важно что бы передавалось минимум байтов через сеть
— если важно что бы не было лишних обменов пакетами

То:
— нужно смотреть на IP или TCP/IP (вам ведь UDP не нужен в данном случае)
— нужно понимать что PHP сам по себе медленный и скрипты при каждом запросе умирают
— нужно понимать что вам потребуется реально работающий сервер, а не скрипты
— нужно понимать что возможно вам больше подойдёт модуль к nginx который дёргает скрипты
— много всего ещё. хайлоад штука сложная. И почти никогда вам не смогу ничего подсказать другие — потому что точно таким же не занимаются.

safenoob: может им и не нужно?:) Естественный отбор:) Что бы сделать из этого полноценный ответ надо привести примеры, нужно так же указать модель взаимодействия клиента и сервера, например:
1. клиенты разные, подключаются, получают ответ, уходят, если заходят снова то работает кеш коннектов или keep-alive что по сути тоже самое, для https кеш хендшейков или вроде того (недавно попадалась статья на эту тему с Golang Meetup что был недавно в Москве в офисе Badoo)
2. клиенты известны, постоянные соединения, можно пулять 1 байт в одну сторону и 1 байт в другую. в самом лучшем случае, в худшем, делать echo где ответ будет содержать контрольный бит или сумму от запроса. Но так или иначе — это улучшит пропускную способность, весь вопрос в уровне надёжности и моделе использования.

При этом рассматривать что клиент или сервер будет на PHP — бессмысленно, разве что клиент на PHP, а сервер на чём-то другом более подходящем, хотя даже в этом случае есть куча других мест где в PHP можно тюнить.

HTTP: пользовательские заголовки

Есть ли в HTTP/1.1 (более ранние уже не актуальны, так?) какой-то формат пользовательских заголовков, то есть, тех, которые гарантированно будут игнорироваться клиентом и не приведут к каким-то конфликтам?

К примеру, в html5 ввели правило: атрибуты узлов, начинающиеся с data- будут игнорироваться и не будут никак задействованы движком — они пользовательские.

Есть ли аналог для хедеров?

1 ответ 1

Да, аналог существует, для этого нужно добавить префикс X- к имени атрибута:

Такие разные заголовки! Изучаем HTTP-взаимодействие

Содержание статьи

Большинство из нас многократно слышали про способность сайтов узнавать информацию о посетителе (и всевозможные предупреждения по этому поводу), которую невозможно узнать из IP-адреса. Это такие «личные» данные, как операционная система, используемый браузер, язык системы. Кто же так жестоко палит нас? И как можно это использовать в своих благих намерениях? Об этом и многом другом ты узнаешь, прочитав статью до конца.

Для начала приведу немного теории о том, чем мы пользуемся довольно давно. HTTP (HyperText Transfer Protocol – «протокол передачи гипертекста») – клиент-серверный протокол передачи данных, который служит для получения информации с веб-сайтов. Был предложен создателем всея WWW Тимом Бернерсом-Ли. Структура его проста: тип сообщения, заголовки, тело сообщения. Существуют RFC, стандартизирующие HTTP (последняя версия – 1.1), согласно которым клиент должен посылать серверу заголовки, содержащие ту самую специфическую информацию о системе и браузере. Обычному пользователю это полезно: сайт в зависимости от клиента может выдать специфическую верстку (пример – google.com) или показать информацию на нужном языке. Однако для хакера раскрытие такой информации может быть вредно или даже опасно.

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

Техническая реализация

Итак, нам необходимо подделывать заголовки, которые браузер шлет серверу. Как кросс-браузерное решение я бы предложил старый быстрый Proxomitron. Изначально он предназначен для удаления рекламы и полного управления содержимым страницы, так что замечательно подходит для наших целей. Работает как HTTP-прокси. С первого взгляда интерфейс Proxomitron’а не очень дружелюбен, однако разобраться в нем – дело нехитрое. Если нужно использовать только подделку заголовков – слева убираем все галки кроме второй. Жмем на «Headers» и редактируем правила подмены: сразу после установки – в списке куча правил, добавить свое можно, нажав на кнопку New. Чтобы задействовать фильтр, нужна галка в поле «out». Обязательно прочитай русский хелп к программе – там отлично все расписано.

Я пользуюсь Mozilla Firefox и предпочитаю вместо внешних программ использовать плагины. Tamper Data позволяет перехватывать запросы и редактировать заголовки в реальном времени – незаменимая вещь при ручной проверке. Все просто: в окне плагина жмем «Запустить перехват» и вмешиваемся, когда необходимо. Имеются пресеты и богатые возможности по изменению значений заголовков.

Для постоянной же подмены заголовков лучше использовать плагин Modify Headers. Сразу после установки необходимо открыть настройки и поставить галку на «Always on», дабы подмена происходила всегда. Настройка элементарная – открыть главное окно плагина и добавить правил. Первое поле – выбор действия («Add» – добавить, «Modify» – изменить, «Filter» – исключить из запроса), второе – название заголовка, третье – значение; в четвертом поле можно оставить записку. Правила можно двигать, включать и выключать.

Вектор поиска

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

PHP-include не подходят, ибо файлы никогда не подключают в зависимости от заголовков. Хотя и есть возможные исключения, к примеру, инклуд файла в зависимости от языка. На практике не встречал.

Пассивные XSS основаны на том, что запрос будет делать непосредственно пользователь. Заставить жертву подменить заголовок едва ли удастся, именно поэтому этот тип нам не подходит. Единственная возможность использовать найденные подменой заголовков пассивные XSS – это если на страницу пишется Referer (ссылающаяся страница), да не простой, а дополнительно декодированный (избавленный от %xx). Тогда можно скриптом перенаправить жертву на себя с нужным параметром и после – на уязвимую страницу, так что параметр запишется в месте Referer’а. Сработает в идеальных условиях, на практике также не встречал.
Активные XSS подходят. Смысл в том, чтобы веб-приложение занесло в базу наш заголовок, а после показало администратору, естественно, не обработав.

SQL-инъекции подходят. Это самый простой тип, достаточно, как и обычно, подставлять кавычку.

PHP-исполнение кода очень редко встречается вообще, а с участием заголовков – еще реже. Однако бывает. Тут преимущество нашего метода в том, что GET и POST данным менее доверяют.


Итак, теперь необходимо составить строку, которая позволяла бы определить наличие уязвимости. Кавычка обязательна. Далее необходимо выйти из возможных тегов: простейший способ сделать это символами «>. И последнее – алерт, дабы не проспать. В итоге у меня вышло ‘»>. Ставить на обнаружение исполнения кода я не стал; если желаешь, добавь, например, чтобы вызвать ошибку и заметить уязвимость. Также можно добавить в конец обратный слеш (пытаясь экранировать закрывающую кавычку), бывают случаи с фильтрацией кавычек, бывают без нее. Считаешь, что строка слишком длинная и может обрезаться? Замени “document.cookie” на «1». Тут главное – приложить фантазию и создать свой идеальной вектор поиска уязвимостей.

Интересные заголовки

Расскажу о наиболее интересных заголовках, с которыми обязательно нужно поиграться при пентесте сайта.

User-Agent

Главный враг шпиона. Больше всех выдает информации о посетителе: браузер, его версию и язык, движок браузера, версию движка, операционную систему. Данные могут быть написаны как угодно, однако примерный формат есть:

Браузер/Версия (Платформа; Шифрование; Система, Язык[; Что-нибудь еще]) [Дополнения].

В качестве платформы чаще всего можно увидеть X11 или Windows, иногда туда прямиком помещают систему, убирая соответствующий заголовок после. «Шифрование» может принимать три значения: “N” (None) – отсутствует, “I” (International) – слабое шифрование ключом до 40 бит, “U” (USA) – сильное шифрование с ключом 128 бит. Сейчас все браузеры используют только сильное шифрование. После скобки добавляется различная информация вроде движка, плагинов, дополнений.

В качестве браузера для совместимости очень часто указывают Mozilla, а уже после информации дописывают реальное название. Это связано с тем, что издавна девелоперы должны были (или просто любили) делать сайты не в соответствии с принятыми стандартами Консорциума Всемирной паутины (World Wide Web Consortium, W3C), а под наиболее распространенные в данное время браузеры, что приводило к еще большему доминированию последних. И сейчас такая практика существует, однако с тем отличием, что популярным браузерам даны дополнительные возможности, связанные с использованием JavaScript’а (например, на распространенном форуме Invision Power Board, в ветке 2.3.x, посмотрите профиль участника с отфильтрованным заголовком и без). Поэтому советую в строку User-Agent’а в любом случае включать определение распространенного браузера.

Referer

Сообщает о странице, с которой пришел пользователь. Заголовок, сильно полезный веб-мастерам для отслеживания путей попадания на их сайты. Написание – ошибка от английского «Referrer» («перенаправляющий»). Большинство браузеров позволяет отключать передачу этого заголовка, однако при этом обычно возникают проблемы с файлообменниками и сайтами-архивами, которым очень жалко отдавать контент без показа рекламы, так что они позволяют скачивать только при наличии их сайта в реферере. Можно подменять ради просмотра отдельных элементов сайта – например, картинок – без загрузки страниц, где они размещены (при условии, что без подделки это сделать не удастся). При пентесте стоит учитывать, что часто в базу записывают URL не полностью, а лишь нужную его часть, поэтому стоит пробовать «http://evil», «http://example.com/evil» и т.д.

X-Forwarded-For

Нестандартный заголовок, используемый неанонимными прокси-серверами для передачи реального IP клиента. Мы не можем вставить кавычку в определяемый сервером IP, зато можем заставить его думать, что это – всего лишь прокси, а настоящий IP – вот он, в X-Forwarded-For. Конечно, далеко не все скрипты используют и полагаются на XFF, но этот заголовок принято хотя бы логировать. Нельзя забывать проверять веб-приложение на наивность (да-да, некоторые сайты, увидев этот заголовок, забывают про обычный IP и пользуются только тем, что передано в данном заголовке). Формат: X-Forwarded-For: client_ip, proxy1_ip, . proxyN_ip.

Accept-Language

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

Accept-Charset

Сообщает допустимые кодировки и их приоритет. Не самый интересный заголовок, но стоит обратить на него внимание, ибо он может выдать твою систему простым «windows-1251».

X-Requested-With

Нестандартный заголовок, сообщает средство запроса. Используется при запросах из JavaScript без перезагрузки страницы. Соответственно полезен для имитации AJAX (Asynchronous Javascript and XML) запросов, для этого необходимо установить его в значение «XMLHttpRequest».

Authorization

Если серверу необходима авторизация пользователя, он об этом прямо сообщает, а браузер предлагает ввести логин и пароль. Именно в заголовке Authorization они передаются в виде «Basic base64(user:pass)». Такую авторизацию намного удобней брутить, чем те, которые располагаются непосредственно на странице (POST).

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

Применение

Итак, практика. Я проводил исследование, в ходе которого некоторое время использовал «пассивное обнаружение уязвимостей». Суть в том, что достаточно однажды выставить замену заголовков, а после – лишь ловить алерты и исследовать бреши.

ЗаголовокЗначениеВключен
User-Agent Opera/10.60 Да
Referer Да
X-Forwarded-For Да
Accept-Language en,en-US;q=0.9 Нет
AuthorizationBasic MScyMzo0JzU2 Нет
X-Requested-WithXMLHttpRequest Нет
CookiePHPSESS >

С первыми тремя, думаю, понятно. Если в ладах с английским, включи на постоянную подмену Accept-Language, дабы принимали за англичанина. Authorization уместно включать только при проверке конкретного сайта, ибо рискуете не понять, если где-нибудь действительно понадобится авторизация. Про применение заголовков X-Requested-With и Cookie я уже писал, однако поясню последний. В PHP довольно удобно хранить данные в сессиях: собственно данные – на сервере, у клиента – только идентификатор в куке «PHPSESSID» (название можно менять, но делают это, естественно, редко). Так вот, иногда этот идентификатор может состоять только из символов a-z, A-Z, 0-9 и ‘-,’, и при передаче чего-то иного вызывается ошибка, раскрывающая абсолютный путь:

Warning: session_start() [function.session-start]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and ‘-,’ in /var/www/data/www/login.php on line 2

Первое, на что я наткнулся – это поплывшая разметка. Да, действительно на многих сайтах происходил выход из какого-нибудь тега (бесполезный), и дальше образовывалась каша. Если ты решишь провести собственно исследование – будь готов. Еще одно: если чувствуешь, что что-то идет не так (например, не дают скачать файл, не показывают картинку во всю ширину, не работает перенаправление), выключай подмену Referer’а.

Никто не знает и не узнает, сколько алертов выловили админы, сколько они их увидели у себя в логах, сколько осталось незамеченными. Однако один случай обнаружения интересной активной XSS есть точно – гугловский сервис FeedBurner, который умеет обрабатывать RSS-фиды и логировать трафик сайта. Но последнее делал он не слишком качественно – не фильтровался Referer. Подробнее об этой уязвимости читай на raz0r.name/vulnerabilities/aktivnaya-xss-na-feedburner/ (wp.me/pft5J-4a) (не удивляйся, увидев алерт из-за XFF :)).

Довольно весело было заходить на всякие сайты с DLE (DataLife Engine), ибо популярный модуль DLE Referer Module не дружил (и не дружит) с экранированием плохих символов. Для убедительности советую пройтись по сайтам продавцов ICQ UIN’ов и увидеть много MySQL-ошибок, хотя картина уже не будет слишком печальной – я разослал владельцам сообщения об уязвимости, ведь неприятно, когда твои платежные данные и ссылки на оплату можно подменить.

Некоторое время назад на php.ru можно было наблюдать ошибки нефильтрации Referer’а и XFF. На данный момент уязвимость закрыта. Из ошибки с реферером:

MySQL Error = You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘»‘)’ at line 1

SQL = INSERT INTO oops_sessions (ID,UID,START,LAST,IPS,PAGES,PAGE,DATA,REFFER) VALUES (‘dpdu7rh90ehfsc62′,’0′,1238958331,1238958331,’xxx.xxx.xxx.xxx’,1,’/’,’a:1:‘,’SQL-Inj’here’)

Еще один пример – cx75planet.ru. Уязвимы User-Agent и XFF. IPB показывает весь запрос. Кроме этих брешей, была замечена еще туча SQL-ошибок на сайтах всех мастей, большинство из которых просто имели самописные модули обработки информации о браузерах, рефах и т.д. Предоставляю тебе возможность найти их все :).

Подмена заголовков в PHP

Естественно, после ручного анализа SQL-уязвимости наступает работа автоматики. Подбор столбцов, полей, вынимание логинов, паролей и хешей – все уже давно делают скрипты. Однако большинство из них направлено на GET, POST или Cookie. Покажу, как можно получить страницу, посылая нужные заголовки. Предположим, у нас есть массив с такими заголовками и вызов функции request, которая должна возвращать страницу:

$headers = array (
‘User-Agent: Babytoy/0.5’,
‘Referer: http://refrefref.ref/omg.pl’
);
$html = request_socket(‘http://127.0.0.1/showmeheaders.php’, $headers);
echo $html;

Есть несколько основных видов получения страницы из PHP (полные версии функций ищи на диске ][):

Сокет

Заголовки напишешь в любом случае. Генерация пакета:

$packet = «GET <$url>HTTP/1.1rn»
. «Host: <$host>rn»
. implode(«rn», $headers) . «rn»
. «Connection: Closernrn»;
— file_get_contents()

Воспользуемся контекстом для задания нужных параметров:

$opts = array (
‘http’ => array (
‘header’ => implode(«rn», $headers) . «rn»
)
);
$context = stream_context_create($opts);
return file_get_contents($url, false, $context);

В curl’е все проще простого: вместе с остальными параметрами достаточно указать curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

Заключение

Хотелось бы обратить внимание, что подмена заголовков – не панацея от сливания информации. Не стоит забывать о JavaScript’е, Flash’е и интерактивных элементах, которые тоже вправе много чего разболтать. Используй NoScript и прочие AdBlock’и. Всегда экспериментируй и прикладывай выдумку, ищи там, где не ищет никто. Удачи!

header

header — отправляет «сырую» HTTP-шапку/header.

Описание

int header (string string [, bool replace])

header() используется для отправки необработанных HTTP-шапок. См. в спецификации HTTP/1.1 информацию о HTTP headers.

Необязательный параметр replace указывает, должна ли шапка замещать предыдущую аналогичную шапку, или нужно добавить вторую header того же самого типа. По умолчанию выполняется замещение, но, если вы передаёте FALSE в качестве второго аргумента, вы можете форсировать создание нескольких headers одного типа. Например:

Здесь два особых вызова шапок. В первом это header, начинающийся строкой » HTTP/ » (регистр не имеет значения), используемый для создания HTTP статус-кода для отправки. Например, если вы сконфигурировали Apache для использования PHP-скрипта для обработки запросов отсутствующих файлов (используя директиву ErrorDocument ), вам потребуется удостовериться, что ваш скрипт генерирует соответствующий статус-код.

Примечание: строка шапки HTTP-статуса всегда будет отправляться первой клиенту, независимо от того, идёт вызов header() первым или нет. Этот статус может быть переопределён вызовом header() с новой строкой статуса в любое время, если только HTTP headers уже не отправлены.

Примечание: в PHP 3 это работает только в том случае, если PHP скомпилирован как Apache-модуль. Вы может добиться того же эффекта, используя шапку Status .

Второй особый случай это «Location:» header. Здесь header не только отсылается обратно браузеру, но также возвращается статус-код REDIRECT (302), если только какой-нибудь 3xx статус-код не был уже установлен.

Примечание: HTTP/1.1 требует абсолютного URI в качестве аргумента для Location: включая схему, имя хоста и абсолютный путь, но некоторые клиенты принимают относительные URI. Как правило вы можете сами использовать $_SERVER[‘HTTP_HOST’] , $_SERVER[‘PHP_SELF’] и dirname() для создания абсолютного URI из относительного:

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

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

Кроме того, session_cache_limiter() и установка конфигурации session.cache_limiter могут использоваться для автоматической генерации корректны шапок кэширования, когда используются сессии.

Помните, что header() обязана вызываться до отправки любого вывода: нормальными ли тэгами HTML, пустыми строками в файле, или из PHP. Очень частой ошибкой является чтение кода функциями include() или require() , или другой функцией доступа к файлу, и наличие пробелов или пустых строк, которые выводятся до вызова header() . Та же проблема возникает при использовании единого PHP/HTML-файла.

Примечание: в PHP 4 вы можете использовать буферизацию вывода для решения этой проблемы, передавая браузеру весь ваш вывод, буферизуемый на сервере до отправки. Вы можете сделать это вызовом ob_start() и ob_end_flush() в вашем скрипте, или установив директиву конфигурации output_buffering в файле php.ini или файлах конфигурации сервера.

Если вы хотите, чтобы пользователю задавался вопрос о сохранении данных, высылаемых вами, таких как сгенерированный PDF-файл, вы можете использовать шапку Content-Disposition для предоставления рекомендуемого файла и форсировать отображение браузером диалога save.

Примечание: в Microsoft Internet Explorer 4.01 имеется баг, не дающий реализовать это. Средства от этого нет. Также имеется баг в Microsoft Internet Explorer 5.5, но его можно исправить, обновив до Service Pack 2 или новее.

Примечание: если safe mode включён, uid скрипта добавляется к части realm шапки WWW-Authenticate , если вы устанавливаете эту шапку (используется для HTTP Authentication).


Что такое заголовки в протоколе HTTP.

Когда мы разбирали общую структуру HTTP запросов и ответов, то одной из частей, из которой эта структура состояла, являлись HTTP заголовки (Message Headers). Давайте сейчас подробнее рассмотрим, что это такое.

Заголовки – это специальные параметры, которые несут определенную служебную информацию о соединении по HTTP. Некоторые заголовки имеют лишь информационный характер для пользователя или для компьютера, другие передают определенные команды, исходя из которых, сервер или клиент будет выполнять какие-то действия.

В зависимости от того, где эти заголовки могут находиться, они разделяются на:

General Headers (Основные заголовки) — должны быть и в запросах и в ответах клиента и сервера.

Request Headers (Заголовки запроса) — используются только в запросах клиента.

Response Headers (Заголовки ответа) — используются только в ответах сервера.

Entity Headers (Заголовки сущности) — сопровождают каждую сущность сообщения.

Каждый заголовок имеет следующий вид:

Немного о правилах написания, что нужно иметь в виду:

1) Регистр (большие или маленькие буквы) здесь не учитываются. Можно писать и так и так.

2) Пишутся латинскими буквами.

3) После параметра должен идти символ двоеточия (:)

4) Окончанием пары «параметр:значение» служит символ переноса строки.

Вот, примеры некоторых заголовков:

На самом деле, количество возможных заголовков, которые можно указать, очень большое. Я не вижу смысла приводить их все здесь.

Если вы знаете английский, то почитать о них можно в оригинале на страницах стандарта HTTP 1.1.

Кроме того, есть перевод этого стандарта на русский язык здесь:

Есть еще хорошая табличка, которая опубликована на страницах википедии:

Кстати, если хотите узнать конверсии и ключевые показатели (KPI) для вашего продающего сайта, могу настроить веб-аналитику.

Яндекс Метрика и Google Analytics. Цели, события, отчеты.

Header — отправляет HTTP-заголовок

Заголовки HTTP используются для «общения» браузера и web-сервера, например, когда браузер запрашивает какой-либо документ, он посылает заголовок GET, а когда сервер возвращает тип документа, то он делает это ни как-нибудь, а в заголовке Content-type.

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

Итак, приведем список и краткое описание основных заголовков HTTP.

Заголовок Accept

Заголовок Accept предназначен для информирования сервера о типах данных, которые поддерживаются клиентом (браузером). В этом заголовке браузер перечисляет, какие типы документов он «понимает». Пере-
числение идет через запятую.

Используется переменная окружения HTTP_ACCEPT. Пример использования:

Accept: text/html, text/plain, image/jpeg

В последнее время вместо списка указывается значение *.*, что означает «все типы».

Заголовок Content-type

Данный заголовок предназначен для идентификации типа передаваемых данных. При этом заголовок Content-type использует переменную окружения CONTENT_TYPE. Обычно для этого заголовка указывается значение application/x-www-form-urlencoded. Таким образом, указывается формат, в котором все управляющие символы (т.е. символы, не являющиеся алфавитно-цифровыми) специально кодируются. О некоторых других MIME-типах вы можете узнать здесь.

Это тот самый формат передачи, который используется методами GET и POST.

Довольно распространен и другой формат, multipart/form-data.

Сервер никак не интерпретирует рассматриваемый заголовок, а просто передает его сценарию через переменную окружения.

Пример: Content-type: text/plain

Заголовок Content-length

Этот заголовок содержит строку, в которой записана длина передаваемых данных в байтах при использовании метода передачи POST. За заголовком закреплена одноименная переменная CONTENT_LENGTH.

Если задействуется метод GET, то этот заголовок отсутствует, и значит, переменная окружения не устанавливается.

Заголовок Cookie

В этом заголовке хранятся все Cookies. Данный заголовок использует переменную окружения HTTP_COOKIE. Для установки Cookies используется заголовок Set-Cookie.

Заголовок GET

Об этом заголовке мы упоминали ранее.

Заголовок GET использует следующие переменные окружения:

  • REQUEST_URI — запрашиваемый идентификатор ресурса;
  • QUERY_STRING — передаваемые сценарию параметры;
  • REQUEST_METHOD — метод передачи информации. В данном случае эта переменная будет содержать значение GET.

Заголовок Location

Получив заголовок Location вместе с указанным в нем URL, сервер немедленно переходит по указанному URL, не дожидаясь, пока тело документа загрузится:

Пример: Location: http://www.somehost.com/

Заголовок POST

Этот заголовок использует те же переменные окружения, что и заголовок GET (переменная REQUEST_METHOD содержит значение POST). Напомним, что данные методом POST можно передавать в конце заголовков.

Напомним формат заголовка POST: POST сценарий?параметры HTTP/1.0

Заголовок Pragma

Данный заголовок используется для различных целей, одна из которых — это запрет кэширования документа.

Пример заголовка: Pragma: no-cache

Данный заголовок содержит название и версию программного обеспечения сервера. Например:

Server: Apache/1.3.23 (Unix) (Red-Hat/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b Dav/1.0.3 PHP/4.3.0 mod_perl/1.26 configured

Заголовок Referer

С помощью этого заголовка можно узнать ссылающийся на нас сервер. Это бывает полезно, когда нам необходимо узать обратные ссылки, например, при анализе эффективности сетевой рекламы.

Переменная окружения: HTTP_REFERER.

Заголовок User-Agent

Содержит версию браузера. Например: User-Agent: Mozilla/5.0 (compatible; Konqueror/3.0.0-10; Linux).

Переменная окружения: HTTP_REFERER.

Некоторые комментарии по HTTP-заголовкам

Мы ознакомились с названиями заголовков и соответствующим им переменным окружения.

Необходимо помнить основные приципы:

  • Все символы в верхнем регистре;
  • В начале имен добавляется HTTP_
  • Символы «-» заменяются знаком подчеркивания «_».

Передача заголовков HTTP в PHP

В PHP есть встроенные функции для работы с заголовками HTTP.

Для передачи заголовков HTTP предназначена функция header()

Приведем практические примеры:

( «Location: http://www.example.com/» ); /* Производит перенаправление браузера на другой ресурс */

/* Внимание! Убедитесь, что код, расположенный ниже не исполняется */
exit;
?>

// Date in the past
header ( «Expires: Mon, 26 Jul 1997 05:00:00 GMT» );

// always modified
header ( «Last-Modified: » . gmdate ( «D, d M Y H:i:s» ) . » GMT» );

// HTTP/1.1
header ( «Cache-Control: no-store, no-cache, must-revalidate» );
header ( «Cache-Control: post-check=0, pre-check=0» , false );

// HTTP/1.0
header ( «Pragma: no-cache» );
?>

Илон Маск рекомендует:  Как сделать ссылку на изображение
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL