Différence entre les codes de redirection HTTP

151

Les différences entre les différents codes de redirection HTTP 3XX ne sont pas claires pour moi. Oui, j'ai lu les spécifications, mais il semble y avoir une certaine divergence entre la norme et la pratique réelle ici.

Le 301code de redirection semble assez clair: cela signifie que la ressource a été déplacée de manière permanente vers un autre URI et que les demandes futures devraient utiliser cet URI.

Et le 307code de redirection semble également clair: cela signifie que la redirection est temporaire et que les demandes futures devraient toujours utiliser l'URI d'origine.

Mais je ne peux pas dire quelle est la différence entre 302et 303, ni pourquoi l'un ou l'autre est vraiment différent de 301. Il semble que 302c'était à l'origine destiné à être une redirection temporaire , (comme 307), mais en pratique, la plupart des navigateurs l'ont traité comme un 303. Mais quelle est la différence entre a 303et a 301? Est-il 301censé signifier que la redirection est plus permanente?

Channel72
la source

Réponses:

139
  • 301 : Redirection permanente. Les clients effectuant des demandes ultérieures pour cette ressource doivent utiliser le nouvel URI. Les clients ne doivent pas suivre automatiquement la redirection pour les demandes POST / PUT / DELETE.
  • 302 : Redirection pour une raison non définie. Les clients effectuant des demandes ultérieures pour cette ressource ne doivent pas utiliser le nouvel URI. Les clients ne doivent pas suivre automatiquement la redirection pour les demandes POST / PUT / DELETE.
  • 303 : Redirection pour une raison non définie. Typiquement, «l'opération est terminée, continuez ailleurs». Les clients effectuant des demandes ultérieures pour cette ressource ne doivent pas utiliser le nouvel URI. Les clients doivent suivre la redirection pour les demandes POST / PUT / DELETE, mais utiliser GET pour la demande de suivi .
  • 307 : Redirection temporaire. La ressource peut revenir à cet emplacement ultérieurement. Les clients effectuant des demandes ultérieures pour cette ressource doivent utiliser l'ancien URI. Les clients ne doivent pas suivre automatiquement la redirection pour les demandes POST / PUT / DELETE.

Je recommande personnellement d'éviter 302 si vous avez le choix. De nombreux clients ne suivent pas la spécification lorsqu'ils rencontrent un 302. Pour les redirections temporaires, vous devez utiliser 303 ou 307, selon le type de comportement souhaité sur les requêtes non GET. Préférez 307 à 303 sauf si vous avez besoin du comportement alternatif sur POST / PUT / DELETE.

Bob Aman
la source
26
Nan. Suivre un 303 nécessite de réécrire la méthode pour GET. Suivre les autres nécessite de conserver la méthode, mais de confirmer avec l'UA si la méthode n'est pas sûre (donc des méthodes autres que OPTIONS, HEAD, GET, PROPFIND ...)
Julian Reschke
1
@JulianReschke Pourriez-vous s'il vous plaît indiquer des endroits dans les spécifications sauvegardant votre déclaration?
Piotr Dobrogost
7
@BobAman Dans votre description, vous faites les mêmes erreurs que dans la spécification HTTP d'origine ( RFC 1945 ). Par exemple, dire que les clients doivent suivre la redirection pour les demandes POST / PUT / DELETE. après la redirection 303 sans préciser que le verbe http à utiliser dans la requête suivante doit être GET est trompeur ...
Piotr Dobrogost
2
Me corriger: "Suivre un 303 nécessite de réécrire la méthode en GET sauf si la méthode initiale était HEAD".
Julian Reschke
2
Piotr: la valeur par défaut devrait être de ne pas modifier la méthode; la ressource déplacée, cela n'affecte pas la manière de la manipuler. 303 est une exception; cela ne signifie pas "la ressource a bougé" mais "la demande a été traitée, et voici votre résultat"; c'est un type de redirection complètement différent. Voir greenbytes.de/tech/webdav
Julian Reschke
84

La différence entre 303 et 307 est la suivante:

303 : Voir autre. La demande est reçue correctement, mais les résultats doivent être récupérés à l'aide d'un GET sur l'URL de redirection.

307 : Redirection temporaire. L'ensemble de la demande doit être redirigé vers la nouvelle URL. Toutes les données de publication doivent être republiées.

Notez que 302 était censé avoir le comportement de 307, mais la plupart des navigateurs l'ont implémenté comme le comportement de 303 (qui n'existaient pas tous les deux à l'époque). Par conséquent, ces deux nouveaux codes ont été introduits pour remplacer 302.

La différence entre 301 et 303:

301 : Le document est déplacé. Les demandes futures doivent utiliser la nouvelle URL. Cette URL est obsolète.

Remarque: soyez prudent avec ce code. Les navigateurs et les proxies ont tendance à appliquer une mise en cache très agressive, donc si vous répondez avec un 301, cela peut prendre un certain temps pour que quelqu'un revisite cette URL.

303 : La demande est reçue correctement. Toutes les demandes PUT sont traitées. Le document résultant peut être récupéré à partir de l'URL de redirection. La demande future doit toujours être envoyée à l'URL d'origine.

GolezTrol
la source
un bon article de blog qui va dans les détails de 3xx (et tous les problèmes avec lui) est à: insanecoding.blogspot.no/2014/02
...
@ skeller88 Votre changement a rendu ma réponse incorrecte alors je l'ai retournée (huez les gens qui ont accepté le changement)! Vous avez introduit la même erreur que la réponse acceptée. 303 est un autre type de redirection et des règles différentes s'appliquent, comme le confirment les commentaires de Julian Reschke sur la réponse acceptée et le blog lié par arcuri82
GolezTrol