Php http header class

header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers.

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include , or require , functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.


/* This will give an error. Note the output
* above, which is before the header() call */
header ( ‘Location: http://www.example.com/’ );
exit;
?>

Parameters

There are two special-case header calls. The first is a header that starts with the string » HTTP/ » (case is not significant), which will be used to figure out the HTTP status code to send. For example, if you have configured Apache to use a PHP script to handle requests for missing files (using the ErrorDocument directive), you may want to make sure that your script generates the proper status code.

// This example illustrates the «HTTP/» special case
// Better alternatives in typical use cases include:
// 1. header($_SERVER[«SERVER_PROTOCOL»] . » 404 Not Found»);
// (to override http status messages for clients that are still using HTTP/1.0)
// 2. http_response_code(404); (to use the default message)
header ( «HTTP/1.1 404 Not Found» );
?>

Читайте также:  Java needs to be installed

The second special case is the «Location:» header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless the 201 or a 3xx status code has already been set.

header ( «Location: http://www.example.com/» ); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>

The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace, but if you pass in false as the second argument you can force multiple headers of the same type. For example:

Forces the HTTP response code to the specified value. Note that this parameter only has an effect if the header is not empty.

Return Values

Errors/Exceptions

On failure to schedule the header to be sent, header() issues an E_WARNING level error.

Examples

Example #1 Download dialog

If you want the user to be prompted to save the data you are sending, such as a generated PDF file, you can use the » Content-Disposition header to supply a recommended filename and force the browser to display the save dialog.

// We’ll be outputting a PDF
header ( ‘Content-Type: application/pdf’ );

// It will be called downloaded.pdf
header ( ‘Content-Disposition: attachment; filename=»downloaded.pdf»‘ );

// The PDF source is in original.pdf
readfile ( ‘original.pdf’ );
?>

Example #2 Caching directives

PHP scripts often generate dynamic content that must not be cached by the client browser or any proxy caches between the server and the client browser. Many proxies and clients can be forced to disable caching with:

header ( «Cache-Control: no-cache, must-revalidate» ); // HTTP/1.1
header ( «Expires: Sat, 26 Jul 1997 05:00:00 GMT» ); // Date in the past
?>

Note:

You may find that your pages aren’t cached even if you don’t output all of the headers above. There are a number of options that users may be able to set for their browser that change its default caching behavior. By sending the headers above, you should override any settings that may otherwise cause the output of your script to be cached.

Additionally, session_cache_limiter() and the session.cache_limiter configuration setting can be used to automatically generate the correct caching-related headers when sessions are being used.

Notes

Note:

Headers will only be accessible and output when a SAPI that supports them is in use.

Note:

You can use output buffering to get around this problem, with the overhead of all of your output to the browser being buffered in the server until you send it. You can do this by calling ob_start() and ob_end_flush() in your script, or setting the output_buffering configuration directive on in your php.ini or server configuration files.

Note:

The HTTP status header line will always be the first sent to the client, regardless of the actual header() call being the first or not. The status may be overridden by calling header() with a new status line at any time unless the HTTP headers have already been sent.

Note:

Most contemporary clients accept relative URI s as argument to » Location:, but some older clients require an absolute URI including the scheme, hostname and absolute path. You can usually use $_SERVER[‘HTTP_HOST’] , $_SERVER[‘PHP_SELF’] and dirname() to make an absolute URI from a relative one yourself:

/* Redirect to a different page in the current directory that was requested */
$host = $_SERVER [ ‘HTTP_HOST’ ];
$uri = rtrim ( dirname ( $_SERVER [ ‘PHP_SELF’ ]), ‘/\\’ );
$extra = ‘mypage.php’ ;
header ( «Location: http:// $host$uri / $extra » );
exit;
?>

Note:

Session ID is not passed with Location header even if session.use_trans_sid is enabled. It must by passed manually using SID constant.

See Also

  • headers_sent() — Checks if or where headers have been sent
  • setcookie() — Send a cookie
  • http_response_code() — Get or Set the HTTP response code
  • header_remove() — Remove previously set headers
  • headers_list() — Returns a list of response headers sent (or ready to send)
  • The section on HTTP authentication
  • Network Functions
    • checkdnsrr
    • closelog
    • dns_​check_​record
    • dns_​get_​mx
    • dns_​get_​record
    • fsockopen
    • gethostbyaddr
    • gethostbyname
    • gethostbynamel
    • gethostname
    • getmxrr
    • getprotobyname
    • getprotobynumber
    • getservbyname
    • getservbyport
    • header_​register_​callback
    • header_​remove
    • header
    • headers_​list
    • headers_​sent
    • http_​response_​code
    • inet_​ntop
    • inet_​pton
    • ip2long
    • long2ip
    • net_​get_​interfaces
    • openlog
    • pfsockopen
    • setcookie
    • setrawcookie
    • socket_​get_​status
    • socket_​set_​blocking
    • socket_​set_​timeout
    • syslog

    Источник

    header

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

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


    /* Этот пример приведет к ошибке. Обратите внимание
    * на тэг вверху, который будет выведен до вызова header() */
    header ( ‘Location: http://www.example.com/’ );
    exit;
    ?>

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

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

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

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

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

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

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

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

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

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

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

    Примеры

    Пример #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 скрипты часто генерируют динамический контент, который не должен кэшироваться клиентским броузером или какими-либо промежуточными обработчиками, вроде прокси серверов. Можно принудительно отключить кэширование на многих прокси серверах и броузерах, передав заголовки:

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

    Замечание:

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

    Дополнительно, для случаев когда используются сессии, можно задать настройки конфигурации 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() :

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

    Замечание:

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

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

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

    Источник

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