Opis
void
header ( string treść_nagłówka [, bool zamień [, int kod_odpowiedzi_http]] )
header() służy do wysłania surowego
nagłówka HTTP.
Zajrzyj do Specyfikacji HTTP 1.1
aby dowiedzieć się więcej na temat nagłówków HTTP.
Notatka:
Począwszy od PHP 4.4.2 i PHP 5.1.2 funkcja nie pozwala na wysłanie
więcej niż jednego nagłowka za jednym razem aby zapobiegać przeciwko
ataką typu iniekcja nagłowka (header injection).
Pierwszy argument opcjonalny zamień określa,
czy funkcja
ma zastąpić nagłówek tego samego typu przygotowany przez serwer,
czy dodać jeszcze jeden. Domyślnie, oryginalny
nagłówek zostanie zastąpiony, ale jeśli ustawisz ten argument na FALSE,
to nowy nagłówek zostanie dodany do już istniejących. Na przykład:
Drugi argument opcjonalny kod_odpowiedzi_http
pozwala
narzucić określony kod odpowiedzi HTTP. (Argument ten jest dostępny w
PHP 4.3.0 i wyższych).
Są dwa specjalne wywołania funkcji header. Pierwszym z nich jest każdy
nagłówek zaczynający się od "HTTP/" (wielkość liter
nie jest istotna). Nagłówka tego używa się do podania statusu zapytania
HTTP. Na przykład, jeśli skonfigurowałeś serwer Apache aby używał skryptu
PHP do wyświetlania komunikatów o brakujących plikach (za pomocą dyrektywy
ErrorDocument), możesz chcieć wypróbować, czy skrypt
generuje właściwy kod statusu.
Notatka:
Status połączenia HTTP zawsze będzie wysłany w pierwszej linii
odpowiedzi serwera, niezależnie od kolejności wywołania funkcji
header(). Aktualnie ustalony status połączenia może
zostać nadpisany nowym, wystarczy tylko po raz kolejny wywołać
funkcję header(). Należy to jednak zrobić, nim
nagłówki zostaną wysłane.
Drugim specjalnym wywołaniem funkcji header jest nagłówek
"Location:". W tej sytuacji, do klienta wysyłany jest nie tylko ten
nagłówek, ale także status przekierowania REDIRECT
(302), o ile inny status zapytania 3xx nie został
już wysłany.
Notatka:
Protokół HTTP 1.1 wymaga bezwzględnego URI w nagłówku
Location:
włącznie z określeniem protokołu, nazwy hosta i bezwzględnej scieżki
dostępu, ale niektóre klienty akceptują względne URI.
Zwykle używa się
$_SERVER['HTTP_HOST'],
$_SERVER['PHP_SELF'] i
funkcji dirname() by wygenerować bezwględny
URI:
Notatka:
Identyfikator sesji nie jest przekazywany w nagłówku Location chociażby session.use_trans_sid był
włączony. Musi zostać przekazanyIt must by ręcznie używając stałej SID.
Skrypty PHP często służą do generowania dynamiczej treści, która
nie może być buforowana przez klienta czy serwer proxy. Pamięć cache
(bufor) w większości tych urządzeń da się wyłączyć dzięki:
Notatka:
Możesz zaobserwować, że strony nie są buforowane, nawet jeśli
nie użyłeś wszystkich ww. nagłówków. Jest wiele sposobów, w jakie
użytkownicy mogą skonfigurować swoje przeglądarki, aby zmienić
standardowy sposób buforowania. Przez wysłanie powyższych nagłówków,
powinno się udać ominąć wszystkie ustawienia pozwalające
na zbuforowanie wyniku pracy twojego skryptu.
Dodatkowo, session_cache_limiter() i dyrektywa
konfiguracyjna session.cache_limiter służą
do automatycznego generowania nagłówków związanych z bufurowaniem,
kiedy sesje są w użyciu.
Pamiętaj, że header() może być wywoływana
jedynie do momentu nim zostanie wysłana jakakolwiek treść, tzn.
znaczniki HTML, puste linie lub wynik pracy PHP. Jest to bardzo
częsty błąd, gdzie skrypty z funkcjami include(),
require() itp. mają spacje albo puste linie przed
wywołaniem funkcji header().
Problem ten pojawia się również w skryptach opartych na
pojedynczym pliku PHP/HTML.
Notatka:
Od PHP 4 można użyć buforowania wyjścia aby ominąć ten problem.
Wszystko, co skrypt wyśle do przeglądarki zostanie zatrzymane na
serwerze do momentu, kiedy pojawi się instrukcja wysłania danych.
Można to zrobić za pomocą funkcji ob_start() i
ob_end_flush(), lub ustawiając dyrektywę kofiguracyjną
output_buffering w pliku php.ini
lub w plikach konfiguracyjnych serwera.
Aby użytkownik został monitowany o zapisanie wysyłanych danych,
takich jak np. wygenerowany plik PDF, można użyć nagłówka Content-Disposition aby podać zalecaną nazwę
pliku i zmusić przeglądarkę do wyświetlenia okienka zapisu pliku.
Notatka:
W Microsoft Internet Explorer 4.01 jest błąd, który uniemożliwia
wykorzystanie tego mechanizmu. Nie ma na to rozwiązania. Błąd, który
zahacza o ten mechanizm, jest także w Microsoft Internet Explorer 5.5,
jednak da się go ominąć aktualizując przeglądarkę poprzez Service Pack 2
lub późniejszy.
Notatka:
Jeśli tryb bezpieczny jest
włączony, uid skryptu jest dodane do części realm
nagłówka WWW-Authenticate, jeśli ustawisz ten
nagłówek (wykorzystuje się go do autoryzacji HTTP).
Patrz także: headers_sent(),
setcookie(), i rozdział
Autoryzacja HTTP.