web-dev-qa-db-fra.com

Une redirection 302 conservera-t-elle la chaîne de référence?

J'ai besoin de rediriger l'utilisateur d'une page à une autre, mais je dois conserver la chaîne de référence d'origine. Ainsi, par exemple, s'ils commencent le http://www.othersite.com/pageA.jsp , cliquez sur un lien qui les mène à http: //www.mysite. com/pageB.jsp , qui exécute ensuite une redirection 302 vers http://www.mysite.com/pageC.jsp , j'ai besoin que la chaîne de référence contienne " http : //www.othersite.com/pageA.jsp "

Est-ce le comportement normal d'une redirection 302? Ou mon référent d'origine serait-il abandonné au profit de " http://www.mysite.com/pageB.jsp "? Ce ne serait pas souhaitable.

Je ne sais pas si cela fait une différence, mais je travaille dans JSP et j'utilise response.sendRedirect () pour exécuter la redirection 302.

Je dois mentionner que j'ai fait une expérience avec cela, et il semble avoir conservé la chaîne de référence d'origine (" http://www.othersite.com/pageA.jsp ") mais je voulais juste assurez-vous que c'était le comportement par défaut normal, et pas quelque chose de bizarre de ma part.

Merci de votre aide.

MODIFIÉ POUR AJOUTER:

Bien que j'utilise actuellement une redirection 302, je pourrais probablement utiliser une redirection 301 à la place. Savez-vous si le comportement des redirections 301 est plus fiable?

88
sangfroid

La réponse courte est qu'elle n'est pas spécifiée dans la RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36 soit pour l'en-tête Referer, soit pour l'état 302 code.

Votre meilleur pari est de faire un test avec plusieurs navigateurs et de voir s'il y a un comportement consensuel.

Pour la ceinture pleine et les bretelles, encodez le référent d'origine dans l'URL de redirection afin que vous puissiez garantir de le récupérer.

30
Malcolm Box

Je ne connais pas le 302, mais j'ai testé le 301 sur certains navigateurs aujourd'hui, voici les résultats:

[[# #]] scénario [~ # ~]: l'utilisateur clique sur le lien sur domainX qui pointe vers domainA. domainA fait une redirection 301 vers domainB.

  • IE8 referer lors de l'atterrissage sur domainB est: domainX (même lorsque vous utilisez la navigation InPrivate et même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • Safari4 referer lors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • FF3.6.10 referer lors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre le lien dans un nouvel onglet)
  • Chrome5 referer lors de l'atterrissage sur domainB est: domainX (sauf l'utilisateur ouvre des liens dans un nouvel onglet)
  • Chrome26 referer lors de l'atterrissage sur domainB est: domainX (même lorsque l'utilisateur ouvre des liens dans un nouvel onglet)
115
Marco Demaio

Bonne question. Dans ce cas, l'envoi du référent dépend entièrement du navigateur (car le navigateur est invité à faire une autre demande à la nouvelle ressource).

RFC 2616 reste silencieux sur le problème:

La ressource demandée réside temporairement sous un URI différent. Étant donné que la redirection peut être modifiée à l'occasion, le client DEVRAIT continuer à utiliser l'URI de demande pour les demandes futures. Cette réponse ne peut être mise en cache que si elle est indiquée par un champ d'en-tête Cache-Control ou Expires.

Je ne ferais pas confiance au navigateur pour envoyer le bon référent. Je parie qu'il y en a au moins un qui envoie quelque chose de différent des autres.

Solution

Si vous le pouvez, pourquoi ne pas ajouter un ?override_referer=<old_url> paramètre à l'URL vers laquelle vous redirigez et analysez cette valeur au lieu de HTTP_REFERER.

De cette façon, vous pouvez être sûr d'obtenir toujours le bon résultat, et vous ne perdez rien en matière de sécurité: le référent peut être truqué de toute façon.

12
Pekka 웃

J'ai eu le problème opposé: je voulais que le référent soit "pageB" mais aucun navigateur courant ne procède de cette façon ...

J'ai donc essayé avec une redirection HTML sur pageB (au lieu de la redirection 301 ou 302):

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

Et le résultat était surprenant:

  • Le référent est la page B avec Chrome
  • Referer est VIDE avec FireFox & IE!

J'espère que cela peut vous aider

5
fred727