$string:
сам заголовок. Бывает двух типов. Первый начинается с «HTTP/» (header(«HTTP/1.0 404 Not Found»);). Второй начинается не с «HTTP/». Состоит из двух частей «имя парметра: значение» (например, «Location: http://www.example.com/» или «Content-type: application/pdf»).
Второй параметр булевого типа. Если true (по умолчанию), то заголовок замещает предыдущий с таким же именем параметра, если false, то передаётся несколько параметров одного типа:
Go
1
2
3
4
<?php
header('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM',false);
?>
Третий параметр, $http_response_code, можно использовать для передачи HTTP-заголовков ответа (200, 404 и т.п.):
Go
1
2
3
4
5
6
7
8
9
10
11
12
// 301 Moved Permanently
header("Location: /foo.php",TRUE,301);
// 302 Found
header("Location: /foo.php",TRUE,302);//это значение по умолчанию.
header("Location: /foo.php");//аналогично
// 303 See Other
header("Location: /foo.php",TRUE,303);
// 307 Temporary Redirect
header("Location: /foo.php",TRUE,307);
Функция header используется для простановки заголовков «вручную», для кеширования, для внешнего перенаправления, для выставления правильного mime-типа и кодировки.
Пример простановки заголовков «вручную»:
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ob_start();
@header("HTTP/1.1 503 Service Temporarily Unavailable");
@header("Status: 503 Service Temporarily Unavailable");
@header("Retry-After: 120");
@header("Connection: Close");
?><!DOCTYPE HTML PUBLIC"-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503Service Temporarily Unavailable</title>
</head><body>
<h1>Service Temporarily Unavailable</h1>
<p>The server is temporarily unable to service your
request due to maintenance downtime or capacity
problems.Please try again later.</p>
</body></html><?php
echo ob_get_clean();
exit();
Пример внешнего перенаправления:
Go
1
2
3
4
5
publicstaticfunctionredirect($url='/')
{
header('Location: '.$url);
die();
}
Пример реализации скачивания файлов по расширению (полезен перечислением mime-типов):
Заголовок header(«Content-Transfer-Encoding: binary»); очень важен для того, чтобы заставить браузер скачивать файл, а не отображать текстовое содержимое.
Пример установки использумой кодировки:
Go
1
2
header('Content-type: text/html; charset=utf-8');
header('Content-type: text/xml; charset=utf-8');
Самая интересная часть: кеширование (w3.org).
Для начала надо заметить, что HTTP/1.0 моежт не поддерживать основную директиву (Cache-Control), поэтому в этом случае нужно использовать заголовок Pragma: no-cache. Хотя уже давно все поддерживают 1.1, поэтому особого смысла это делать нет.
Заголовок Cache-Control может использоваться как для запроса, так и для ответа. Нас интересует только ответ.
Синтаксис следующий: «Cache-Control: значение».
Значения:
Go
1
2
3
4
5
6
7
8
9
10
11
"public"//может кешироваться всеми (прокси-серверами тоже)
"private"//может кешироваться клиентом
"no-cache"//должен кешироваться клиентом (есть ещё доп. параметры)
"no-store"//не сохранять на диске
"no-transform"//для прокси-серверов запрещает изменять тип файла (для картинок, к примеру)
"must-revalidate"//все должны подтвердить наличие кеша
"proxy-revalidate"//прокси должен подтвердить наличие кеша
"max-age""="delta-seconds//закешировать на это время
"s-maxage""="delta-seconds//для общего кеша (не private) переопределяет значение "max-age" и заголовок "Expires:"
Например:
Cache-Control:max-age=значение
Заголовок Expires используется для задания даты, при которой кеш считается просроченным
(Expires: Thu, 01 Dec 1994 16:00:00 GMT), можно задавать дату в прошлом (значит, кеш уже просрочен) или в будущем. При этом если используется заголовок Cache-Control: max-age=значение, то он переопределяет заголовок Expires.
Заголовок ETag используется для создания «тегов», по сравнению которых можно определить, актуален ли кеш в браузере/на прокси-сервере.
Использование: ETag: уникальный тег.
Обычно для создания тегов советуют использовать что-то вроде:
Go
1
2
$etag=md5_file($file);
header("Etag: $etag");
Думаю, для кеширования картинок вполне достаточно этого:
Go
1
2
$etag=filesize($file);
header("Etag: $etag");
Но только делать такие вещи в том же Nginx (возможно там такой механизм уже есть).
Для запрета кеширования обычно используется связка
для flash нужен заголовок
header(«Content-Type: application/x-shockwave-flash»);
т.е.
в скрипте после строки
case «avi»: $ctype=»video/x-msvideo»; break;
нужно добавить
case «swf»: $ctype=»application/x-shockwave-flash»; break;
header(«Content-Type: application/x-shockwave-flash»);
т.е.
в скрипте после строки
case «avi»: $ctype=»video/x-msvideo»; break;
нужно добавить
case «swf»: $ctype=»application/x-shockwave-flash»; break;
case ‘zip’: $ctype = ‘application/zip, application/octet-stream’; break;