159 votes

Différence entre les codes de redirection HTTP

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

Le site 301 Le code de redirection semble assez clair : Cela signifie que la ressource a été déplacée de façon permanente vers un autre URI, et que les futures demandes devront utiliser cet URI.

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

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

150voto

Bob Aman Points 19110
  • 301 : Redirection permanente. Les clients effectuant des demandes ultérieures pour cette ressource doivent utiliser la nouvelle URI. Les clients doivent pas suivre la redirection automatiquement pour les demandes POST/PUT/DELETE.
  • 302 : Redirection pour une raison indéfinie. Les clients effectuant des demandes ultérieures pour cette ressource doivent pas utiliser le nouvel URI. Les clients doivent pas suivre la redirection automatiquement pour les demandes POST/PUT/DELETE.
  • 303 : Redirection pour une raison indéfinie. Typiquement, "L'opération est terminée, continuez ailleurs". Les clients effectuant des demandes ultérieures pour cette ressource doivent pas utiliser le nouvel URI. Clients devrait suivent 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'ancienne URI. Les clients doivent pas suivre la redirection automatiquement pour les demandes POST/PUT/DELETE.

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

27 votes

Nope. Suivre une 303 nécessite de réécrire la méthode en GET. Suivre les autres nécessite de garder la méthode, mais de confirmer avec l'UA si la méthode n'est pas sûre (donc les méthodes autres que OPTIONS, HEAD, GET, PROPFIND...).

0 votes

Oui, c'est exact. Donc, pour clarifier, vous utilisez une 303 lorsque vous avez un formulaire POSTed, que vous avez terminé l'opération et que vous voulez que l'utilisateur aille ailleurs. C'est particulièrement utile pour éviter le cas où l'utilisateur rafraîchit la page après avoir envoyé le formulaire, et obtient soit un avertissement qu'il annule, soit la possibilité qu'il soumette à nouveau les données du formulaire.

1 votes

@JulianReschke Pouvez-vous s'il vous plaît indiquer les endroits dans les spécifications qui soutiennent votre déclaration ?

87voto

GolezTrol Points 54531

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

303 : Voir autre. La requête est reçue correctement, mais les résultats doivent être récupérés en utilisant un GET sur l'url de redirection.

307 : Redirection temporaire. La requête entière doit être redirigée vers la nouvelle url. Toutes les données du message doivent être réaffichées.

Notez que 302 devait avoir le comportement du 307, mais la plupart des navigateurs l'ont implémenté comme le comportement du 303 (les deux n'existaient pas à l'époque). Ces deux nouveaux codes ont donc été introduits pour remplacer le 302.

La différence entre 301 et 303 :

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

Note : 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 par un 301, il peut s'écouler un long moment avant que quelqu'un ne revisite cette url.

303 : La demande est reçue correctement. Les éventuelles demandes PUT sont traitées. Le site document final peut être récupéré à partir de l'url de redirection. Les futures requêtes doivent toujours aller vers l'url d'origine.

1 votes

Un bon article de blog qui entre dans les détails de 3xx (et de tous les problèmes qu'il pose) se trouve à l'adresse suivante : insanecoding.blogspot.no/2014/02/

1 votes

@skeller88 Votre changement a rendu ma réponse incorrecte donc je l'ai reverté (bouh aux personnes qui ont accepté le changement) ! Vous avez introduit la même erreur que la réponse acceptée a. 303 est un type différent 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.

0 votes

J'aime cette réponse beaucoup plus que la réponse acceptée parce qu'elle déclare explicitement pourquoi deux nouveaux codes (303 et 307) ont été introduits au lieu d'en introduire un seul (ce qui me semble plus logique), qui préserve la méthode HTTP en plus du 302 déjà existant, qui ne le fait pas. En réalité, 302 fonctionne exactement comme 303 dans la plupart des navigateurs. Mais cela contredit la spécification, et c'est pourquoi 303 a été introduit. Cela signifie que le 302 ne devrait pas être utilisé du tout, car si la plupart des clients logiciels l'implémentent comme le 303, d'autres peuvent suivre la spécification qui, ironiquement, violera le comportement "attendu".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X