Exemples de 302 vs 303

22

Quelle est la difference entre a 302et 303response?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • 10.3.3 302 trouvé
  • 10.3.4 303 Voir autres

Sont-ils interchangeables ou pourquoi l'un serait-il utilisé l'un par rapport à l'autre? Pourriez-vous s'il vous plaît fournir un cas d'utilisation du moment où l'un serait utilisé (et l'autre pas)?

David542
la source

Réponses:

35

La description sur la page à laquelle vous avez lié semble être assez descriptive de leur objectif:

Une redirection 302 indique que la redirection est temporaire - les clients doivent vérifier à nouveau l'URL d'origine dans les demandes futures.

Une redirection 303 est destinée à rediriger une POSTdemande vers une GETressource (sinon, le client suppose que la méthode de demande pour le nouvel emplacement est la même que pour la ressource d'origine).

Si vous redirigez un client dans le cadre de votre application Web mais que vous vous attendez à ce qu'il démarre toujours à l'application Web (par exemple, un raccourcisseur d'URL), une redirection 302 semble avoir du sens. Une redirection 303 est à utiliser lorsque vous recevez des POSTdonnées d'un client (par exemple, une soumission de formulaire) et que vous souhaitez les rediriger vers une nouvelle page Web à récupérer à la GETplace de POST(par exemple, une demande de page standard).

Mais consultez cette note dans les définitions de code d'état - la plupart des clients feront la même chose pour un 302 ou 303:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
larsks
la source
4
Clair mais faux. Une redirection 303 n'est pas permanente. Le RFC indique "La réponse 303 NE DOIT PAS être mise en cache" . La description que vous avez donnée ici correspond à une redirection 301.
Ladadadada
2
Mea culpa. J'avais 301 et 303 en arrière. J'ai mis à jour la réponse.
larsks
il y en a 308 maintenant
Miranda
Je pense qu'il est un peu trompeur de suggérer que 303 est "destiné" à rediriger un POST vers un GET - point final. La spécification suggère que 303 concerne davantage la disponibilité d'une représentation d'une ressource via la méthode initialement demandée. Si, par exemple, j'ai une grande image protégée par des droits uniquement disponible pour les utilisateurs authentifiés, je peux utiliser un 303 pour rediriger les utilisateurs non authentifiés vers une image plus petite. La méthode de demande utilisée dans un tel cas n'est pas pertinente.
beaudet
Le RFC dit "Cette méthode existe principalement pour permettre la sortie d'un script activé par POST pour rediriger l'agent utilisateur vers une ressource sélectionnée." et "La réponse à la demande peut être trouvée sous un URI différent et DEVRAIT être récupérée en utilisant une méthode GET sur cette ressource". Je pense que cela correspond à peu près à ce que j'ai dit (il y a toutes ces années), mais je suis sûr qu'il y a de la place pour l'interprétation.
larsks
15

Il existe actuellement quatre types de redirection différents. À l'origine, il n'y en avait que deux, mais la plupart des clients ont implémenté la redirection 302 de manière incorrecte, deux autres ont donc été ajoutés pour clarifier la différence entre les deux comportements possibles différents lors de la réception d'un 302.

Le RFC que vous avez lié à indique ceci dans la section sur les redirections 302:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
  1. Une redirection 301 est une redirection permanente. Il peut être mis en cache et tous les signets de cette URL doivent être mis à jour pour pointer vers la nouvelle URL.
  2. Une redirection 302 est une redirection temporaire. Il ne peut pas être mis en cache par défaut et doit être redemandé à chaque fois (mais vous pouvez le remplacer avec des en-têtes de mise en cache). La demande de suivi doit utiliser la même méthode (POST, GET, CONNECT, PUT, DELETE, etc.) que la demande d'origine et pour toute autre chose que les demandes GET et HEAD, le client doit inviter l'utilisateur avant de faire la demande. C'est la partie que les clients se sont trompés et la plupart d'entre eux changent la méthode de la demande de suivi en GET, quelle que soit la méthode d'origine.
  3. Une redirection 303 est identique à une 302, sauf que la demande de suivi est désormais explicitement modifiée en demande GET et aucune confirmation n'est requise.
  4. Une redirection 307 est identique à une 302, sauf que la demande de suivi est désormais explicitement la même que la demande d'origine et une confirmation doit être acquise de l'utilisateur pour les méthodes de demande autres que GET et HEAD.

Les clients plus âgés peuvent ne pas comprendre la redirection 303. Tout ce qui fait une requête HTTP / 1.1 doit comprendre une réponse 303.

Il est possible de considérer 300 et 305 réponses comme des redirections, ce qui signifie qu'il existe six types différents.

Ladadadada
la source
0

Les types de redirection (301, 302, 303 ...) utilisés ont beaucoup d'impact sur la façon dont les moteurs de recherche indexeront et classeront le contenu. Certaines araignées pourraient même refuser d'indexer du contenu temporairement redirigé. Les détails peuvent être trouvés dans diverses publications SEO ...

rackandboneman
la source