Es bien sabido que el fragmento de URL (la parte posterior a #
) no se envía al servidor.
Sin embargo, me pregunto cómo funcionan los fragmentos cuando Location:
está involucrado un redireccionamiento del servidor (a través del estado 302 de HTTP y el encabezado).
Mi pregunta es realmente doble:
Si la URL original tenía un fragmento (
/original.php#foo
), y se realiza una redirección/new.php
, ¿se pierde la parte del fragmento de la URL original? ¿O a veces se aplica a la nueva URL?
¿La nueva URL alguna vez estará/new.php#foo
en este caso?Independientemente de la URL original, si el servidor redirige a una nueva URL con un fragmento (
/new.php#foo
), ¿se "honrará" el fragmento? ¿O el servidor realmente no tiene ningún problema para interferir con el fragmento? ¿El navegador lo ignorará simplemente yendo a/new.php
?
Respuestas:
Actualización 2014-junio-27 :
RFC 7231, Protocolo de transferencia de hipertexto (HTTP / 1.1): semántica y contenido , se ha publicado como una NORMA PROPUESTA. Desde el registro de cambios :
Los puntos importantes de la Sección 7.1.2. Ubicación :
Esto debería responder claramente a sus preguntas.
Actualizar FIN
Este es un problema abierto (no especificado) con la especificación HTTP actual . se aborda en 2 números del grupo de trabajo httpbis de IETF :
# 6 permite fragmentos en el
Location
encabezado. # 43 dice esto:Esto lleva a la respuesta más compatible con el navegador y a prueba de futuro (porque este problema finalmente se estandarizará) responde a su pregunta:
R: los fragmentos de las URL originales se descartan.
B: se respetan los fragmentos del
Location
encabezado.fuente
Safari 5 e IE9 y versiones posteriores sueltan el fragmento del URI original si se produce una redirección HTTP / 3xx. Si el encabezado Ubicación en la respuesta especifica un fragmento, se utiliza.
IE10 +, Chrome 11+, Firefox 4+ y Opera "volverán a unir" el fragmento del URI original después de seguir una redirección 3xx.
Página de prueba: http://www.webdbg.com/test/redir/fragment/ .
Consulte más información sobre este tema en http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
fuente
Location
contiene un fragmento, lo mantendrá correctamente. Pero si un redireccionadoLocation
con un fragmento pasa por otro redireccionamiento 3xx, ignorará inexplicablemente el fragmento de la primera redirección, lo que no es consistente con los 2 comportamientos anteriores. Chrome y Firefox lo conservan constantemente.Solo para hacerle saber, aquí puede encontrar las especificaciones adecuadas. por w3c definiendo cómo deben comportarse todos: http://www.w3.org/TR/cuap#uri - cláusula 4.1 - ver abajo:
fuente
Publicar un problema similar con la solución que enfrento.
Espero que ayude a alguien con el requisito similar de
preserving hash in IE
redireccionamientos 302.Agregar partes esenciales de la respuesta en lugar de solo enlaces
Usamos
SiteMinder
autenticación en nuestra aplicación.Me di cuenta de que, después de una autenticación exitosa,
SiteMinder
está haciendo302 redirection
la página de aplicación solicitada por el usuario mediante el uso de la variable oculta del formulario de inicio de sesiónvalue
(donde almacena la URL solicitada por el usuario/myapp/
,without hash fragment
ya que no se enviará al servidor) con un nombre similar aredirect
. Ejemplo de formulario a continuaciónDado
redirect
que el valor de la variable oculta contiene solo/myapp/
sin fragmento hash y es una redirección 302, IE elimina automáticamente el fragmento hash incluso antes de llegar a nuestra aplicación y las soluciones que estamos probando en nuestro código de aplicación no están funcionando.IE solo está redirigiendo
/myapp/
y está aterrizando en la página de inicio predeterminada de nuestra aplicaciónhttps://ourapp.com/myapp/#/home
.He perdido casi un día para descubrir este comportamiento.
La solucion es:
Han cambiado la forma de la conexión de variables ocultas (
redirect
) valor para sostener el fragmento de hash anexandowindow.location.hash
junto con el valor existente. Similar al siguiente códigoDespués de este cambio, la
redirect
variable oculta almacena el valor de URL solicitado por el usuario/myapp/#/pending/requests
ySiteMinder
lo redirige a/myapp/#/pending/requests
IE.La solución anterior está funcionando bien en los tres navegadores
Chrome, Firefox and IE
.Gracias a @AlexFord por la explicación detallada y la solución a este problema.
fuente