404 header – HTTP 1.0 o 1.1?

Perché quasi ogni esempio che riesco a trovare (compresa questa domanda da circa un anno fa) dice che un header 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 HTTP/1.1 404 Not Found invece?

(Non che importi più di tanto … sono per lo più solo curioso).

L’utilizzo della versione HTTP può essere basato sui seguenti fattori:

  • Il tuo server web supporta HTTP 1.0 o 1.1
  • Supporto del browser Web per HTTP 1.0 o 1.1
  • La tua preferenza come sviluppatore web su quale versione di protocollo utilizzare

I browser moderni possono supportare sia la versione 1.0 che la versione 1.1, e sia il client che il server si accontenteranno della versione più alta che entrambi possono supportare insieme. Le principali differenze tra il protocollo 2 possono essere trovate: http://www8.org/w8-papers/5c-protocols/key/key.html

Tuttavia non vi sono differenze chiave nell’uso di 404 Not Found. Tuttavia, sii coerente per tutto il tuo sito web. cioè se usi HTTP / 1.1, lo usi attraverso il tuo sito web.

In PHP dovresti probabilmente usare:

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

o ancora meglio

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

(se supportato) e quindi lasciare al web-server quale protocollo utilizzare.

In realtà, se si passa il codice di stato come 3 ° parametro, è ansible passare tutto ciò che si desidera nella prima, purché non sia vuoto, e PHP farà il resto. Vedi http://php.net/header

 header("foobar", true, 404 ); 

Inoltre: non è ansible richiedere una determinata versione del protocollo dal lato client poiché la transazione è basata su 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.

Non importa molto. 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 al server di utilizzare HTTP 1.0, ma è andato avanti e ha risposto con HTTP 1.1.

Avrei pensato che la risposta dovesse essere 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 cliente comprende 1.1 (ad esempio perché è quello che ha chiesto), allora la risposta 1.1 dovrebbe funzionare.

Probabilmente, gioca sul sicuro e invia la risposta 1.0.

Guardando entrambi gli RFC 1.1 e 1.0, 404 è presente in entrambi, quindi non è probabilmente per nessun altro motivo che il server comunica al client che sta funzionando su HTTP 1.1.

Detto questo, se un server risponde con 404 su HTTP 1.1, implica che avrebbe potuto restituire 410 – Via per indicare una risorsa che prima esisteva ma non più. Questo codice di stato non fa parte di 1.0 e pertanto queste informazioni potrebbero essere utili a un client (in particolare i web crawler).

MODIFICARE

Scusa – probabilmente questa risposta sta rispondendo 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.

Con le versioni moderne di PHP puoi anche utilizzare la funzione http_response_code e http_response_code completamente il problema!

Mi piace anche questo metodo perché significa che non vi è alcun rischio di errori di battitura nel messaggio di risposta.