Każdy szanujący się programista php musi wiedzieć jak działa protokół HTTP. Poznajmy więc podstawy na jakich opiera się jego działanie.
Na Hypertext Transfer Protocol składają się żądania wysyłane przez klienta i odpowiedzi przesyłane przez serwer. Kiedy wpisujemy w naszej przeglądarce internetowej adres strony www, którą chcemy odwiedzić i wciskamy enter, wówczas do serwera wysyłane jest zapytanie HTTP (najpierw tworzone jest z nim połączenie TCP/IP na porcie 80). Może ono wyglądać następująco (dla adresu http://tvn24.pl/newsy.html):
GET /newsy.html HTTP/1.1
Host: tvn24.pl
Accept: application/xhtml+xml, text/html
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.5
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Connection: Keep-Alive
Omówmy sobie znaczenie poszczególnych linii:
GET /newsy.html HTTP/1.1
GET określa metodę HTTP, /newsy.html zasób o który pytamy, HTTP/1.1 wersję protokołu.
Host: tvn24.pl
Dzięki nagłówkowi Host serwery mogą obsługiwać wiele domen, wykorzystując jeden adres IP. Jest on wymagany w wersji HTTP 1.1
Accept: application/xhtml+xml, text/html
Typy MIME dokumentów jakie umiemy odczytywać.
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Preferowany język dokumentu. Jeżeli istnieje dokument to niech będzie on w języku pl, a jeśli takiego nie ma to wolimy en-us. W ostateczności może być en. Więcej na temat możliwości jakie daję ów nagłówek znajdziecie np. w dokumentacji Apache’a TUTAJ
Accept-Encoding: gzip, deflate
Oznacza kodowanie treści – najczęściej informujemy o możliwej kompresji przesyłanych do nas przez serwer dokumentów.
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.5
Kodowanie znaków w żądanym dokumencie. Jeśli nie ma ISO-8859-2 to UTF-8. Ewentualnie każdy inny.
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Identyfikacja naszej przeglądarki.
Connection: Keep-Alive
W HTTP 1.1 nie jest wymagany, gdyż połączenie Keep Alive jest domyślne. Oznacza chęć nawiązania stałego połączenia.
Serwer www dla naszego żądania przesyła odpowiedź, która może wyglądać tak:
HTTP/1.1 200 OK
Date: Mon, 10 Dec 2008 20:00:00 GMT
Server: Apache/2.0.52 (Unix) DAV/2
Cache-Control: max-age=0
Connection: close
Content-Type: text/html; charset=iso-8859-2
[pusty wiersz]
<html>...
Zajmijmy się szczegółową analizą powyższego przykładu:
HTTP/1.1 200 OK
Jest to informacja dla klienta: protokół HTTP/1.1 i kod statusu 200, co oznacza że wszystko odbyło się prawidłowo, a dane zostały wysłane do przeglądarki. Istnieje wiele kodów odpowiedzi (gdzie xx to cyfry):
- 1xx – są to najczęściej informacje ogólne
- 2xx – żądanie zostało prawidłowo obsłużone
- 3xx – żądanie jest przekierowane do innej lokalizacji (np. 301 – zasób przeniesiony na stałe pod nową lokalizację)
- 4xx – żądanie zostało źle przetworzone (np. 404 – brak zasobu)
- 5xx – są to błędy serwera (np. 503 – usługa chwilowo niedostępna)
Date: Mon, 10 Dec 2008 20:00:00 GMT
Nic innego jak czas na serwerze, z którego dostajemy odpowiedź.
Server: Apache/2.0.52 (Unix) DAV/2
Identyfikacja serwera.
Cache-Control: max-age=0
Przekazuje przeglądarce dane na temat sposobu przechowywania przesłanych zasobów w cache’u. Max-age=sekundy oznacza, że strona może znajdować się w pamięci podręcznej nie dłużej niz określoną ilość sekund. Po upływie tego czasu konieczne jest ponowne pobranie dokumentu.
Connection: close
Informacja, że połączenie zostanie zamknięte, po przesłaniu odpowiedzi.
Content-Type: text/html; charset=iso-8859-2
Typ MIME dokumentu i kodowanie znaków.
<html>...
Żądany zasób, w tym wypadku strona www.
metody HTTP 1.1
W naszym przykładzie wykorzystywaliśmy metodę GET. Istnieją jednak inne. Najważniejsze to:
- GET – używamy, gdy chcemy odczytać konkretny zasób
- POST – używamy, w przypadku chęci przesłania danych na serwer (lub nie wysyłania danych z formularzy w sposób „jawny”)
- HEAD – używamy, jeśli chcemy uzyskać informacje o konkretnym zasobie, a nie jego zawartość
Rzadziej wykorzystywane: PUT, OPTIONS, DELETE, CONNECT, TRACE.
dostęp do nagłówków HTTP z poziomu PHP
Dla uzyskania dostępu do tych przesyłanych od klienta możemy się posłużyć funkcją apache_request_headers() – pod warunkiem, że PHP jest zainstalowane jako moduł Apache’a. Aby ustawić nagłówki odpowiedzi używamy funkcji header(). Proszę pamiętać, że ustawienie nagłówka musi nastąpić przed wysłaniem czegokolwiek do przeglądarki – wynika to z specyfikacji protokołu HTTP. Przykład użycia:
//error 404
header("HTTP/1.1 404 Not Found");
Na zakończenie
Oczywiście przedstawiłem tylko niektóre nagłówki dla żądań i odpowiedzi protokołu HTTP. Dla zainteresowanych proponuje zapoznać się z pełną specyfikacją dostępną TUTAJ.

