Fragmento de URL y redirecciones 302


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 un redireccionamiento del servidor (a través del estado HTTP 302 y el encabezado Location:) está involucrado.

Mi pregunta es realmente doble:

  1. Si la URL original tenía un fragmento (/original.php#foo), y se hace una redirección a /new.php, ¿la parte del fragmento de la URL original simplemente se pierde? O a veces se aplica a la nueva URL?
    Será el nuevo URL ever be /new.php#foo en este caso?

  2. Independientemente de la URL original, si el servidor redirige a una nueva URL con un fragmento (/new.php#foo), ¿el fragmento será "honrado"? ¿O el servidor realmente no tiene nada que ver con interferir con el fragmento en absoluto -- y, por lo tanto, el navegador lo ignorará simplemente yendo a /new.php??

Author: levik, 2010-02-18

3 answers

Actualización 2014-Jun-27:

RFC 7231, Protocolo de Transferencia de Hipertexto (HTTP/1.1): Semántica y Contenido, ha sido publicado como un ESTÁNDAR PROPUESTO. De la Lista de cambios :

La sintaxis del campo de encabezado de ubicación se ha cambiado para permitir todo Referencias URI, incluyendo referencias relativas y fragmentos, junto con algunas aclaraciones en cuanto a cuándo el uso de fragmentos no sería adecuado. (Sección 7.1.2)

El puntos importantes de Sección 7.1.2. Ubicación:

Si el valor de Ubicación proporcionado en una respuesta 3xx (Redirección) no tiene un componente de fragmento, un agente de usuario DEBE procesar el redirección como si el valor heredara el componente fragment del URI referencia utilizada para generar el destino de la solicitud (es decir, la redirección hereda el fragmento de referencia original, si lo hay).

Por ejemplo, un OBTENER solicitud generada para la referencia URI " http://www.example.org / ~tim " podría resultar en un 303 (Ver Otros) respuesta que contiene el campo de encabezado:

Location: /People.html#tim

Que sugiere que el agente de usuario redirija a " http://www.example.org/People.html#tim "

Del mismo modo, se genera una solicitud GET para la referencia URI " http://www.example.org/index.html#larry " podría resultar en un 301 (Movido Permanentemente) respuesta que contiene el campo de encabezado:

Location: http://www.example.net/index.html

Lo que sugiere que la agente de usuario redirigir a " http://www.example.net/index.html#larry ", preservando el original identificador de fragmento.

Esto debería responder claramente a sus preguntas.

FIN de actualización

Este es un problema abierto (no especificado) con la especificación HTTP actual . it is addressed in 2 issues of the IETF httpbis working group :

#6 permite fragmentos en el encabezado Location. #43 dice esto:

Acabo de probar esto con varios navegadores.

  • Firefox y Safari usan el fragmento en el encabezado de ubicación.
  • Opera utiliza el fragmento del URI de origen, cuando está presente, de lo contrario el fragmento de la ubicación de redirección
  • IE (8) ignora el fragmento en el URI de ubicación, por lo tanto utilizará el fragmento de la fuente URI, cuando está presente

Propuesta:

"Nota: el comportamiento cuando los identificadores de fragmento del URI original y la redirección deben combinarse no está definido; los agentes de usuario actuales de hecho difieren en qué fragmento tiene prioridad."

[...]

Parece que IE8 utiliza el fragmento idenfitier de Location (el comportamiento que vi podría estar limitado a localhost).

Por lo tanto, parece que tenemos un comportamiento consistente para Safari / IE / Firefox / Chrome (recién probado), en el que el fragmento de la cabecera de ubicación se utiliza, no importa cuál era el URI original.

Por lo tanto, cambio mi propuesta para documentar que como comportamiento esperado.

Esto conduce al navegador más compatible y a prueba de futuro (porque este problema eventualmente se estandarizará) respuesta a su pregunta:

R: los fragmentos de URLs originales se descartan.

B: fragmentos de el encabezado Location es honrado.

 111
Author: ax.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-27 22:09:52

Safari 5 e IE9 y siguientes sueltan el fragmento del URI original si se produce una redirección HTTP/3xx. Si el encabezado de ubicación de la respuesta especifica un fragmento, se utiliza.

IE10+, Chrome 11+, Firefox 4+, y Opera todos "volver a unir" el fragmento de la URI original después de seguir una redirección 3xx.

Página de Prueba: http://www.webdbg.com/test/redir/fragment/.

Véase más información sobre esta cuestión en http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx

 36
Author: EricLaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 21:53:48

Solo para que sepas, aquí puedes encontrar las especificaciones adecuadas. por w3c definiendo cómo todos deben comportarse: http://www.w3.org/TR/cuap#uri - cláusula 4.1-véase a continuación:

Cuando un recurso (URI1) se ha movido, una redirección HTTP puede indicar su nueva ubicación (URI2).

Si URI1 tiene un identificador de fragmento # frag, entonces el nuevo el agente de usuario debe estar tratando de llegar sería URI2 # frag. Si URI2 ya tiene un identificador de fragmento, entonces no se debe agregar # frag y el nuevo objetivo es URI2.

Incorrecto: La mayoría de los agentes de usuario actuales implementan redirecciones HTTP pero no añadir el identificador de fragmento al nuevo URI, que generalmente confunde al usuario porque terminan con el recurso equivocado.

Referencias:

Las redirecciones HTTP se describen en la sección 10.3 de HTTP/1.1 especificación [RFC2616]. El comportamiento requerido se describe en detalle en " Manejo de identificadores de fragmentos en URLs redirigidas "[RURL]. El plazo "Persistent Uniform Resource Locator (PURL)" designa una URL (a caso especial de un URI) que apunta a otro a través de un HTTP redirigir. Para obtener más información, consulte " Recurso uniforme persistente Locators "[PURL]. Ejemplo:

Supongamos que un usuario solicita el recurso en http://www.w3.org/TR/WD-ruby/#changes y el servidor redirige la agente de usuario a http://www.w3.org/TR/ruby / . Antes de buscar este último URI, el navegador debe anexar el identificador de fragmento # cambia: http://www.w3.org/TR/ruby/#changes .

 8
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-28 09:54:03