![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 6 Dołączył: 17.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
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
zwraca
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. Ten post edytował Force 28.08.2013, 17:58:45 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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 Jak widzisz Apache zwraca uwagę na metodę HTTP i reaguje prawidłowo. 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> 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 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: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" 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. 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.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. 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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 17:51 |