2009-06-17 11 views
6

Są tam wiele sposobów, aby napisać nagłówek HTTP Status:Składnia nagłówków HTTP statusie

HTTP/1.1 404 Not Found 
Status: 404 
Status: 404 Not Found 

ale który jest semantycznie poprawne i Spec-zgodny sposób?

Edycja: Według nagłówków statusu mam na myśli this, używając funkcji takiej jak PHP header().

Odpowiedz

1

Najbliższy rzeczą znalazłem na odpowiedź jest Fast CGI spec, który stany, aby ustawić kody statusu poprzez nagłówki stanu i lokalizacji.

4

Dodanie pewnych informacji jakiś czas później, ponieważ natknąłem się na to pytanie podczas badania czegoś związanego.

wierzę pole nagłówka status został wynaleziony jako część specyfikacji CGI, RFC 3875:

https://tools.ietf.org/html/rfc3875#section-6.3.3

Cytując:

The Status header field contains a 3-digit integer result code that 
indicates the level of success of the script's attempt to handle the 
request. 

    Status   = "Status:" status-code SP reason-phrase NL 
    status-code = "200" | "302" | "400" | "501" | extension-code 
    extension-code = 3digit 
    reason-phrase = *TEXT 

Pozwala skrypt CGI do zwróci kod statusu do serwera WWW, który zastępuje domyślny stan widoczny w linii statusu HTTP. Zazwyczaj serwer buforuje wynik ze skryptu i emituje nowy nagłówek dla klienta. Ten jest poprawnym nagłówkiem HTTP, który zaczyna się od poprawionego wiersza statusu HTTP i pomija pole nagłówka "Status:" skryptów (oraz kilka innych transformacji wymaganych przez RFC).

Wszystkie twoje przykłady są ważne od CGI skryptu, ale tylko pierwszy jest naprawdę poprawny w nagłówku HTTP. Te dwa ostatnie są ważne tylko ze skryptu CGI (lub może aplikacji FastCGI).

Skrypt CGI może również działać w trybie "nie przeanalizowanego nagłówka" (NPH), gdy generuje kompletny i prawidłowy nagłówek HTTP, który serwer WWW przekazuje dosłownie klientowi. Jako takie nie powinno to obejmować pola nagłówka Status:.

Uwaga, interesuje mnie, jaki status powinien wygrać, jeśli skrypt NPH trochę go zepsuje i wyśle ​​pole Status: header, być może oprócz linii statusu HTTP. Nie mogę znaleźć żadnego wyraźnego wskazania, więc podejrzewam, że pozostało to do implementacji tego, co parsuje dane wyjściowe, zarówno klienta, jak i serwer.