Cabecera 404 – HTTP 1.0 o 1.1?

¿Por qué casi todos los ejemplos que puedo encontrar (incluida esta pregunta de hace aproximadamente un año) dicen que un encabezado 404 debería ser HTTP/1.0 404 Not Found cuando hemos estado utilizando HTTP 1.1 durante más de una década? ¿Hay alguna razón para no enviar HTTP/1.1 404 Not Found lugar?

(No es que importe tanto … En su mayoría solo tengo curiosidad).

El uso de la versión HTTP puede basarse en los siguientes factores:

  • Su servidor web admite HTTP 1.0 o 1.1
  • El soporte del navegador web para HTTP 1.0 o 1.1
  • Su preferencia como desarrollador web sobre qué versión de protocolo usar

Los navegadores modernos pueden soportar tanto 1.0 como 1.1, y tanto el cliente como el servidor se conformarán con la versión más alta que ambos puedan soportar juntos. Las diferencias clave entre el protocolo 2 se pueden encontrar: http://www8.org/w8-papers/5c-protocols/key/key.html

Sin embargo, no hay diferencias clave en el uso de 404 Not Found. Sin embargo, sea coherente para todo su sitio web. es decir, si usa HTTP / 1.1, lo usa en su sitio web.

En PHP probablemente deberías usar:

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

o mejor

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

(si es compatible) y así dejarle al servidor web qué protocolo usar.

En realidad, si pasa el código de estado como tercer parámetro, puede pasar lo que quiera en el primero, siempre que no esté vacío, y PHP hará el rest. Ver http://php.net/header

 header("foobar", true, 404 ); 

Además: no puede solicitar una determinada versión de protocolo desde el lado del cliente, ya que la transacción se basa en saltos y saltos, y no de extremo a extremo. El servidor y su navegador pueden usar HTTP / 1.1, pero si un proxy intermedio está usando solo HTTP / 1.0, eso es lo que verá de su cliente.

No importa mucho. El cliente es responsable de decirle al servidor qué versión de HTTP utiliza. Entonces, el servidor debe responder con la misma versión. Esto no siempre sucede; Acabo de recibir esta respuesta de un servidor:

 $ 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 

Le pedí al servidor que utilizara HTTP 1.0, pero siguió adelante y respondió con HTTP 1.1.

Pensé que la respuesta debería ser HTTP/1.0 404 Not Found si la solicitud era HTTP 1.0 y HTTP/1.1 404 Not Found si la solicitud era HTTP 1.1.

En la práctica, será más fácil para los servidores devolver respuestas enlatadas, y los clientes 1.0 y 1.1 comprenderán la respuesta HTTP 1.0, por lo que es más seguro devolverla. Si sabe que el cliente entiende 1.1 (por ejemplo, porque eso es lo que pidió), entonces la respuesta 1.1 debería funcionar.

Discutiblemente, juega seguro y envía la respuesta 1.0.

Mirando tanto el RFC 1.1 como el 1.0, el 404 está presente en ambos, por lo que probablemente sea solo por el hecho de que el servidor le comunique al cliente que está operando en http 1.1.

Dicho eso, si un servidor responde con 404 sobre Http 1.1, implica que podría haber regresado 410 – Se ha ido en su lugar para indicar un recurso que solía existir pero que ya no existe. Este código de estado no es parte de 1.0 y, por lo tanto, esta información podría ser útil para un cliente (especialmente los rastreadores web).

EDITAR

Lo siento, ¡esta respuesta probablemente esté respondiendo al revés! Creo que probablemente solo puedas contar con unas pocas manos la cantidad de servidores web públicos que se molestarán en recordar todos los recursos que solían existir y que ya no funcionan (¡de ninguna manera codificaría eso en mi servidor web!) – así que probablemente sea mejor responder con 1.0 404 para indicar que ‘simplemente no está allí’ en lugar de ‘eso no está aquí, pero otras cosas alrededor del sitio podrían haberlo sido pero no más, en cuyo caso podría haberte enviado a 410 ‘.

También está el hecho de que permite que clientes de solo 1.0 trabajen con su sitio.

Dicho eso, todo es un poco pedante.

¡Con las versiones modernas de PHP también puede usar la función http_response_code y esquivar el problema por completo!

También me gusta este método porque significa que no hay riesgo de hacer errores tipográficos en el mensaje de respuesta.