2010-05-04 12 views
18

Perché quasi tutti gli esempi che riesco a trovare (compreso lo this question di circa un anno fa) affermano che l'intestazione 404 dovrebbe essere HTTP/1.0 404 Not Found quando abbiamo utilizzato l'HTTP 1.1 per oltre un decennio? C'è qualche motivo per non inviare invece HTTP/1.1 404 Not Found?404 header - HTTP 1.0 o 1.1?

(Non che sia importante più di tanto ... Sono per lo più solo curioso.)

+0

Circa 11 milioni di risultati Google per '1.0', circa 4.3 milioni di risultati per' 1.1'. Immagino che significhi usare '1.0'. –

+1

Quella domanda non ha detto che l'intestazione dovrebbe essere HTTP/1.0. Era usato solo in quell'esempio. quindi non dare per scontato =) – mauris

risposta

5

L'uso di HTTP versione può essere basata sui seguenti fattori:

  • Il vostro supporto per il server Web per HTTP 1.0 o 1.1
  • supporto del browser Web per HTTP 1.0 o 1.1
  • La vostra preferenza come sviluppatore web sul quale versione del protocollo da utilizzare

Browser moderni in grado di supportare sia 1.0 e 1.1 bene, e sia il client e il server si sistemerà per la versione più alto sia in grado di supportare insieme. Le differenze principali tra il protocollo 2 possono essere trovate: http://www8.org/w8-papers/5c-protocols/key/key.html

Tuttavia non vi sono differenze chiave nell'utilizzo di 404 Not Found. Tuttavia, sii coerente per tutto il tuo sito web. Ad esempio, se usi HTTP/1.1, lo usi in tutto il tuo sito web.

1

Guardando entrambe le RFC 1.1 e 1.0, 404 c'è in entrambi - quindi è probabilmente per nessun altro motivo che affinché il server comunichi al client che sta funzionando su HTTP 1.1.

Detto questo, se un server risponde con 404 su HTTP 1.1, implica che potrebbe essere restituito 410 - Gone per indicare una risorsa che esisteva ma che non esiste più. Questo codice di stato non fa parte di 1.0 e pertanto questa informazione potrebbe essere essere utile per un client (in particolare i web crawler).

EDIT

Siamo spiacenti - questa risposta è probabilmente risponde il contrario! Penso che probabilmente basterai su poche mani il numero di server web pubblici che si prenderanno la briga di ricordare tutte le risorse che esistevano e che non funzionano più (in nessun modo potrei codificarle nel mio server web!) - quindi è probabilmente meglio rispondere con 1.0 404 per indicare che "non è lì" piuttosto che "non è qui, ma altre cose nel sito potrebbero essere state ma non più - nel qual caso avrei potuto inviarti a 410 '.

C'è anche il fatto che stai permettendo a client solo 1.0 di lavorare con il tuo sito.

Detto questo, è tutto un po 'pedante.

2

Non importa più di tanto. Il client è responsabile di comunicare al server quale versione di HTTP utilizza. Quindi, il server dovrebbe rispondere con la stessa versione. Questo non sempre accade; Ho appena ricevuto questa risposta da un server:

$ telnet example.com 80 
Trying 123.123.123.123... 
Connected to example.com. 
Escape character is '^]'. 
GET /fork HTTP/1.0 

HTTP/1.1 404 Not Found 
Content-Length: 1635 
Content-Type: text/html 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Date: Tue, 04 May 2010 22:30:36 GMT 
Connection: close 

ho chiesto il server per utilizzare HTTP 1.0, ma è andato avanti e ha risposto con HTTP 1.1.

2

Avrei pensato che la risposta fosse HTTP/1.0 404 Not Found se la richiesta era un HTTP 1.0 e HTTP/1.1 404 Not Found se la richiesta era HTTP 1.1.

In pratica, sarà più facile per i server restituire risposte predefinite e la risposta HTTP 1.0 sarà compresa sia dai client 1.0 che 1.1, quindi è più sicuro restituirla. Se sai che il client comprende 1.1 (ad esempio perché è quello che ha chiesto), allora la risposta 1.1 dovrebbe funzionare.

Probabilmente, sii sicuro e invia la risposta 1.0.

+1

Sì, non è necessario utilizzare 1.1 quando non si utilizzano le funzionalità 1.1 – Earlz

26

In PHP probabilmente si dovrebbe usare:

header($_SERVER['SERVER_PROTOCOL']." 404 Not Found", true); 

o meglio ancora

header($_ENV['SERVER_PROTOCOL']." 404 Not Found", true); 

(se supportato) e quindi lasciare che sia il web-server il protocollo da utilizzare.

In realtà, se si passa il codice di stato come 3 ° parametro, è possibile passare tutto ciò che si desidera nel primo, a condizione che non sia vuoto, e PHP farà il resto. Vedere http://php.net/header

header("foobar", true, 404); 

anche: Non richiesta può una certa versione del protocollo dal lato client in quanto l'operazione è basata hop-to-hop, e non end-to-end. Il server e il tuo browser potrebbero utilizzare molto bene HTTP/1.1, ma se un proxy tra di essi utilizza solo HTTP/1.0, questo è ciò che vedrai dal tuo client.

+0

Esiste comunque un modo per afferrare le intestazioni * raw * inviate dal client? Con questo intendo le intestazioni linea per linea. – Pacerier

+0

@Pacerier Non conosco le intestazioni RAW, ma fanno tutti parte dell'array $ _SERVER. – DanMan

+0

No Voglio dire, voglio ottenere le intestazioni di testo prima che vengano analizzate nell'array. – Pacerier

Problemi correlati