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):

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.

Tagi : , ,

Napisz komentarz