web-dev-qa-db-fra.com

En-tête 404 - HTTP 1.0 ou 1.1?

Pourquoi presque tous les exemples que je peux trouver (y compris cette question posée il y a environ un an) indiquent-ils qu'un en-tête 404 devrait être HTTP/1.0 404 Not Found alors que nous utilisons réellement HTTP 1.1 depuis plus de 10 ans? Y a-t-il une raison pour ne pas envoyer HTTP/1.1 404 Not Found à la place?

(Pas que ça compte tout autant… Je suis surtout curieux.)

19
keithjgrant

L'utilisation de la version HTTP peut être basée sur les facteurs suivants:

  • Votre serveur Web prend en charge HTTP 1.0 ou 1.1
  • Prise en charge de HTTP 1.0 ou 1.1 par le navigateur Web
  • Votre préférence en tant que développeur Web sur la version du protocole à utiliser

Les navigateurs modernes peuvent bien prendre en charge les versions 1.0 et 1.1, et le client et le serveur se contenteront de la version la plus récente prise en charge simultanément. Les principales différences entre le protocole 2 peuvent être trouvées: http://www8.org/w8-papers/5c-protocols/key/key.html

Cependant, il n'y a pas de différences majeures dans l'utilisation de 404 Not Found. Cependant, soyez cohérent pour l'ensemble de votre site Web. si vous utilisez HTTP/1.1, vous l’utilisez dans votre site Web.

6
mauris

Dans PHP, vous devriez probablement utiliser:

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

ou même mieux

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

(si pris en charge) et ainsi laisser au serveur Web le protocole à utiliser.

En fait, si vous transmettez le code de statut en tant que troisième paramètre, vous pouvez transmettre ce que vous voulez dans le premier, à condition que ce ne soit pas vide, et PHP fera le reste. Voir http://php.net/header

header("foobar", true, 404 );

En outre: vous ne pouvez pas demander une certaine version du protocole auprès du client, car la transaction est basée sur le principe sauts à sauts et non de bout en bout. Le serveur et votre navigateur peuvent très bien utiliser HTTP/1.1, mais si un proxy utilise uniquement HTTP/1.0, c'est ce que vous verrez de votre client.

28
DanMan

J'aurais pensé que la réponse devrait être HTTP/1.0 404 Not Found si la demande était HTTP 1.0 et HTTP/1.1 404 Not Found si la demande était HTTP 1.1.

En pratique, il sera plus facile pour les serveurs de renvoyer des réponses prédéfinies, et la réponse HTTP 1.0 sera comprise par les clients 1.0 et 1.1, il est donc plus sûr de renvoyer cette réponse. Si vous savez que le client comprend la version 1.1 (par exemple, c'est ce qu'il a demandé), la réponse 1.1 devrait alors fonctionner. 

On peut soutenir que c'est prudent et envoyer la réponse 1.0.

2
skaffman

Ce n'est pas si grave que ça. Le client est responsable de dire au serveur quelle version de HTTP il utilise. Ensuite, le serveur est censé répondre avec la même version. Cela n'arrive pas toujours; Je viens de recevoir cette réponse d'un serveur: 

$ 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

J'ai demandé au serveur d'utiliser HTTP 1.0, mais il est allé de l'avant et a répondu avec HTTP 1.1.

2
Kevin Panko

En ce qui concerne les RFC 1.1 et 1.0, le 404 est présent dans les deux - il est donc probable que le serveur n’a aucune autre raison que de communiquer au client son fonctionnement sur http 1.1.

Cela dit - si un serveur répond par 404 via HTTP 1.1, cela signifie qu'il aurait pu renvoyer 410 - Gone à la place pour indiquer une ressource qui existait mais ne le fait plus. Ce code d'état ne fait pas partie de la version 1.0 et, par conséquent, cette information pourrait être utile à un client (en particulier les robots Web).

EDIT 

Désolé, cette réponse répond probablement à l'inverse! Je pense que vous ne pouvez probablement compter que sur quelques mains du nombre de serveurs Web publics qui se donneront la peine de se souvenir de toutes les ressources qui existaient auparavant et qui ne le sont plus (impossible de coder cela sur mon serveur Web!) - Par conséquent, il est probablement préférable de répondre avec le chiffre 1.0 404 pour indiquer que «ce n'est tout simplement pas là» plutôt que «ce n'est pas ici, mais d'autres éléments sur le site ont peut-être existé, mais pas plus longtemps. Dans ce cas, j'aurais pu vous envoyer un 410 '.

Il y a aussi le fait que vous permettez aux clients 1.0 uniquement de travailler avec votre site.

Cela dit, tout est un peu pédant.

1
Andras Zoltan

Avec les versions modernes de PHP, vous pouvez également utiliser la fonction http_response_code et éviter complètement le problème!

J'aime aussi cette méthode car cela signifie qu'il n'y a aucun risque de faute de frappe dans le message de réponse.

0
jsaigle