Il est bien connu que le fragment d'URL (la partie après le #
) n'est pas envoyé au serveur.
Je me demande cependant comment les fragments fonctionnent lorsqu'une redirection de serveur (via le statut HTTP 302 et l'en- Location:
tête) est impliquée.
Ma question est vraiment double:
Si l'URL d'origine avait un fragment (
/original.php#foo
) et qu'une redirection est effectuée/new.php
, la partie fragment de l'URL d'origine est-elle simplement perdue? Ou est-il parfois appliqué à la nouvelle URL?
La nouvelle URL sera-t-elle un jour/new.php#foo
dans ce cas?Quelle que soit l'URL d'origine, si le serveur redirige vers une nouvelle URL avec un fragment (
/new.php#foo
), le fragment sera-t-il "honoré"? Ou est-ce que le serveur n'a vraiment aucune raison d'interférer avec le fragment - et le navigateur l'ignorera-t-il donc simplement en allant sur/new.php
??
Réponses:
Mise à jour du 27 juin 2014 :
La RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantics and Content , a été publiée en tant que STANDARD PROPOSÉ. Depuis le journal des modifications :
Les points importants de la section 7.1.2. Lieu :
Cela devrait clairement répondre à vos questions.
Mettre à jour END
il s'agit d'un problème ouvert (non spécifié) avec la spécification HTTP actuelle . il est abordé dans 2 numéros du groupe de travail IETF httpbis :
# 6 autorise les fragments dans l'en-
Location
tête. # 43 dit ceci:cela conduit à la réponse la plus compatible avec les navigateurs et la plus pérenne (car ce problème finira par être normalisé) à votre question:
R: les fragments des URL d'origine sont supprimés.
B: les fragments de l'en-
Location
tête sont honorés.la source
Safari 5 et IE9 et inférieurs suppriment le fragment de l'URI d'origine si une redirection HTTP / 3xx se produit. Si l'en-tête Location de la réponse spécifie un fragment, il est utilisé.
IE10 +, Chrome 11+, Firefox 4+ et Opera "rattacheront" tous le fragment de l'URI d'origine après avoir suivi une redirection 3xx.
Page de test: http://www.webdbg.com/test/redir/fragment/ .
Pour plus d'informations sur ce problème, consultez http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
la source
Location
contient un fragment, elle le conservera correctement. Mais si une redirectionLocation
avec un fragment passe par une autre redirection 3xx, elle ignorera inexplicablement le fragment de la première redirection, ce qui n'est pas cohérent avec les 2 comportements précédents. Chrome et Firefox le préservent systématiquement.Juste pour vous le faire savoir, vous trouverez ici les spécifications appropriées. par w3c définissant comment tout le monde doit se comporter: http://www.w3.org/TR/cuap#uri - clause 4.1 - voir ci-dessous:
la source
Publication d'un problème similaire avec la solution que j'ai rencontrée.
J'espère que cela aidera quelqu'un avec l'exigence similaire de
preserving hash in IE
pour 302 redirections.Ajouter des parties essentielles de la réponse au lieu des liens seuls
Nous utilisons l'
SiteMinder
authentification dans notre application.Je me suis dit que , après une authentification réussie,
SiteMinder
est fait302 redirection
à la page d'application demandée d'utilisateur à l'aide sous forme de connexion variable cachéevalue
(où il stocke des données d' URL demandé/myapp/
-without hash fragment
car il ne sera pas envoyé au serveur) avec un nom semblable àredirect
. Exemple de formulaire ci-dessousÉtant donné que la valeur de la
redirect
variable cachée contient uniquement sans fragment de hachage et qu'il s'agit d'une redirection 302, le fragment de hachage est automatiquement supprimé par IE avant même d'arriver à notre application et quelles que soient les solutions que nous essayons dans notre code d'application, elles ne fonctionnent pas./myapp/
IE redirige
/myapp/
uniquement vers et atterrit sur la page d'accueil par défaut de notre applicationhttps://ourapp.com/myapp/#/home
.J'ai perdu presque une journée pour comprendre ce comportement.
La solution est:
Ont changé la valeur de la variable cachée ( ) du formulaire de connexion pour contenir le fragment de hachage en l'ajoutant avec la valeur existante. Similaire au code ci-dessous
redirect
window.location.hash
Après ce changement, la
redirect
variable masquée stocke la valeur de l'URL demandée par l'utilisateur en tant que/myapp/#/pending/requests
et laSiteMinder
redirige vers/myapp/#/pending/requests
dans IE.La solution ci-dessus fonctionne correctement dans les trois navigateurs
Chrome, Firefox and IE
.Merci à @AlexFord pour l' explication détaillée et la solution à ce problème.
la source