2008-11-11 10 views

Respuesta

171

¿Qué ocurre si el navegador recibe una respuesta de redireccionamiento a una solicitud de AJAX?

Si el servidor envía una redirección (también conocida como respuesta 302 más una ubicación: encabezado), el navegador sigue automáticamente la redirección. La respuesta a la segunda solicitud (asumiendo que tampoco es otra redirección) es lo que está expuesto a su programa.

De hecho, no tiene la capacidad de detectar si se ha producido una respuesta 302. Si la redirección 302 conduce a 200, entonces su programa actúa de manera idéntica como si la solicitud original condujera directamente a 200.

Esto ha sido mi experiencia y la behavior called out in the spec.

2016 Actualización: El tiempo ha pasado, y la buena noticia es que el nuevo fetch() API se spec'da para ofrecer finer-grained control of how redirects are handled, con un comportamiento por defecto similar a XHR. Dicho esto, solo funciona donde fetch() se implementa nativamente. Polyfill versions of fetch(), que se basan en XHR-continue to have XHR's limitations. Afortunadamente, native browser support parece estar redondeando muy bien.

+32

Curiosamente, llegué a esto porque estoy experimentando una situación en la que aparentemente no se sigue la redirección ... esto sucede cuando la redirección viola la misma política de origen. – Gus

+2

@Gus que probablemente sea lógico – Dmitry

+0

¿Qué se supone que sucederá si la redirección conduce a un 401 en lugar de a un 200? Parece que me estoy encontrando con ese problema y estoy recibiendo errores con jQuery, así que estoy tratando de averiguar exactamente qué se supone que está haciendo el navegador/JS. –

7

El ajax-request seguirá esa redirección afaik. El contenido real (.responseText, .responseXML) será el contenido de la página a la que se le redirige.

Es posible que pueda interceptar la redirección (status-code, location-header) en readyState 2 o 3, pero no está seguro de ello.

+0

No, todos esos estados tienen exactamente el mismo estado. Incluso el valor de 'getAllResponseHeaders()' es igual. – sebastianwagner

Cuestiones relacionadas