Napisany paź-30-2008
podstawy protokołu http
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):
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 określa metodę HTTP, /newsy.html zasób o który pytamy, HTTP/1.1 wersję protokołu.
Dzięki nagłówkowi Host serwery mogą obsługiwać wiele domen, wykorzystując jeden adres IP. Jest on wymagany w wersji HTTP 1.1
Typy MIME dokumentów jakie umiemy odczytywać.
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
Oznacza kodowanie treści - najczęściej informujemy o możliwej kompresji przesyłanych do nas przez serwer dokumentów.
Kodowanie znaków w żądanym dokumencie. Jeśli nie ma ISO-8859-2 to UTF-8. Ewentualnie każdy inny.
Identyfikacja naszej przeglądarki.
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:
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:
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)
Nic innego jak czas na serwerze, z którego dostajemy odpowiedź.
Identyfikacja serwera.
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.
Informacja, że połączenie zostanie zamknięte, po przesłaniu odpowiedzi.
Typ MIME dokumentu i kodowanie znaków.
Żą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.
