Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Protokół HTTP
Forum PHP.pl > Forum > Serwery WWW
Force
Ostatnio czytałem na wikipedii o http i kodach odpowiedzi
http://pl.wikipedia.org/wiki/Hypertext_Transfer_Protocol
http://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP
i zastanowiło mnie czy w dzisiejszych popularnych serwerach jak apache, nginx, lighttpd i innych implementuje się te wszystkie opcje.
Przykładowo są metody
GET,HEAD, PUT, POST, DELETE, OPTIONS, TRACE, CONNECT.
O ile GET, POST czy HEAD stosowałem o tyle nigdy się nie spotkałem.
Przykładowo wysłanie nagłówka DELETE. Z ciekawości sprawdziłem i
  1. DELETE / HTTP/1.1
  2. Host: forum.php.pl

zwraca
  1. HTTP/1.1 200 OK

natomiast strona nie została skasowana mimo, że wyświetlił OK.

Kolejną sprawą są kody http
Przykładowo kod 505 HTTP Version Not Supported
Wysłałem nagłówek
HEAD / HTTP/testWersjiHTTP
Host: forum.php.pl
i w odpowiedzi dostałem normalnie "HTTP/1.1 200 OK" mimo, że nie istnieje protokół "HTTP/testWersjiHTTP"

Według tabelki po przyjęciu danych POST powinno się przekierować na stronę wynikową kodem 303, a tymczasowe przekierowanie do którego popularnie stosuje się kod 302 powinno być wysyłane z kodem 307.
Albo też kod "410 Gone". Wydaje mi się, że byłaby to ciekawa alternatywa dla 404, dzięki czemu można by rozpoznać czy dany zasób nie istnieje i nie istniał czy został skasowany.

Prosiłbym, żeby w temacie wypowiedzieli się szczególnie ludzie którzy stosują jakieś nietypowe metody http na swoich stronach, albo jakieś mało znane kody http, albo też osoby współtworzące przeglądarki i serwery www jak wygląda sytuacja z implementacją tych mało znanych opcji protokołu http.
Crozin
1. Oprogramowanie, które wymieniłeś bardzo często będzie starało się za wszelką cenę obsłużyć żądania, które do niego trafiają. Przykładowo nagłówki w żądaniu HTTP powinny być oddzielone znakiem nowej linii w formie CR+LF (tj. tej znanej z Windowsa). Jednak o ile dobrze pamiętam wszystkie wymienione przez Ciebie serwery przyjmą bez problemu jako nową linię samo LF co według standardu HTTP jest niepoprawnym zachowaniem.
2. Serwery podane przez Ciebie są aplikacjami, które nie zawsze są wstanie samodzielnie obsłużyć dane żądanie. Chodzi mi tutaj przede wszystkim o sytuacje gdzie obsługa żądania oddelegowana jest do przykładowo skryptu PHP. Wtedy to już aplikacja PHP musiałaby zajmować się wszystkimi aspektami żądania HTTP. Prosty test (do wykonania przy pomocy tego forum)
Kod
HEAD /style_images/top/logo.png HTTP/1.1
Host: forum.php.pl
Kod
Date: Wed, 28 Aug 2013 17:37:12 GMT
Server: Apache/2.0.61 (Unix) mod_ssl/2.0.61 OpenSSL/0.9.8o mod_auth_pgsql/2.0.3 PHP/5.2.17
ETag: "1acd-4973f92794ec0"
Accept-Ranges: bytes
Content-Length: 6861
Cache-Control: max-age=2592000, public, must-revalidate
Expires: Fri, 27 Sep 2013 17:37:12 GMT
Content-Type: image/png
Kod
DELETE /style_images/top/logo.png HTTP/1.1
Host: forum.php.pl
Kod
HTTP/1.1 405 Method Not Allowed
Date: Wed, 28 Aug 2013 17:37:47 GMT
Server: Apache/2.0.61 (Unix) mod_ssl/2.0.61 OpenSSL/0.9.8o mod_auth_pgsql/2.0.3 PHP/5.2.17
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 387
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
<p>The requested method DELETE is not allowed for the URL /style_images/top/logo.png.</p>
<hr>
<address>Apache/2.0.61 (Unix) mod_ssl/2.0.61 OpenSSL/0.9.8o mod_auth_pgsql/2.0.3 PHP/5.2.17 Server at forum.php.pl Port 80</address>
</body></html>
Jak widzisz Apache zwraca uwagę na metodę HTTP i reaguje prawidłowo.
Przy Twoim teście (odwołanie do zasobu "/" (strona główna forum)) całe żądanie zostało przekazane do obsługi skryptowi PHP forum, a ten najwidoczniej po prostu ignoruje metodę HTTP (równie dobrze możesz skorzystać z metody HTTP ALAMAKOTA). Czy takie zachowanie jest poprawne? Według standardu HTTP nie i skrypt obsługujący to forum działa błędnie.
Cytat
Kolejną sprawą są kody http
Przykładowo kod 505 HTTP Version Not Supported
Wysłałem nagłówek
HEAD / HTTP/testWersjiHTTP
Host: forum.php.pl
i w odpowiedzi dostałem normalnie "HTTP/1.1 200 OK" mimo, że nie istnieje protokół "HTTP/testWersjiHTTP"
Jak już pisałem w punkcie pierwszym taki Apache spróbuje mimo wszystko obsłużyć błędne żądanie, ale serwery Google'a (GFE) już zwracają poprawnie:
Kod
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 925
Date: Wed, 28 Aug 2013 17:51:07 GMT
Server: GFE/2.0
Cytat
Według tabelki po przyjęciu danych POST powinno się przekierować na stronę wynikową kodem 303, a tymczasowe przekierowanie do którego popularnie stosuje się kod 302 powinno być wysyłane z kodem 307.
Albo też kod "410 Gone". Wydaje mi się, że byłaby to ciekawa alternatywa dla 404, dzięki czemu można by rozpoznać czy dany zasób nie istnieje i nie istniał czy został skasowany.
Ponownie: ustalenie takich nagłówków leży już w kompetencjach aplikacji, nie serwera (bo skąd ten ma wiedzieć czy jakiś plik kiedyś na nim istniał). Pozostaje jeszcze problem kompatybilności. W przypadku kodów 301, 302, 403, 404 czy 500 mamy właściwie gwarancję, że każda przeglądarka czy biblioteka od obsługi HTTP obsłuży je poprawnie (ponieważ są popularne) - w przypadku reszty aż tak dobrze nie jest.

Gdzie stosuje się elementy HTTP "w pełni poprawnie" na poziomie aplikacji?
1. Usługi oparte o REST (Google: RESTful webservices).
2. W sieciach wewnętrznych, gdzie korzystamy przykładowo z reverse proxy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.