Evitar la redirección de Xmlhttprequest

112

¿Es posible evitar que el navegador siga las redirecciones al enviar XMLHttpRequest-s (es decir, para recuperar el código de estado de la redirección y manejarlo yo mismo)?

Zim
fuente

Respuestas:

102

No de acuerdo con el estándar W3C para el objeto XMLHttpRequest (énfasis agregado):

Si la respuesta es una redirección HTTP:

Si el origen de la URL transmitida por el encabezado Location es el mismo origen que el origen de XMLHttpRequest y la redirección no viola las precauciones de bucle infinito, siga de manera transparente la redirección mientras observa las reglas de eventos de solicitud del mismo origen.

Lo estaban considerando para un lanzamiento futuro:

Esta especificación no incluye las siguientes características que se están considerando para una versión futura de esta especificación:

  • Propiedad para deshabilitar las siguientes redirecciones;

pero la última especificación ya no menciona esto.

Chico baukema
fuente
5
Lo que es ridículo es cuando la redirección transparente implica sobrescribir algunos encabezados HTTP que se establecieron en la solicitud original. Específicamente, si el encabezado "Aceptar" se configuró en un tipo de contenido específico, Firefox no incluye este encabezado cuando sigue la redirección (lo que hace que sea un poco más difícil desarrollar servicios web completamente basados ​​en REST que usen este encabezado ... queja).
ruquay
1
Un poco más de la búsqueda me trajo esta bastante antiguo informe de error: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay
2
De acuerdo, defecto de diseño totalmente rediculus.
Rasive
35

El nuevo Fetch API soportes diferentes modos de manejo de redirección: follow, errory manual, pero no puedo encontrar una manera de ver la nueva dirección URL o el código de estado cuando el cambio de dirección ha sido cancelada. Simplemente puede detener la redirección en sí, y luego parece un error (respuesta vacía). Si eso es todo lo que necesita, ya está listo. Además, debe tener en cuenta que las solicitudes realizadas a través de esta API aún no se pueden cancelar . Ahora lo son .

En cuanto a XMLHttpRequest, puede acceder HEADal servidor e inspeccionar si la URL ha cambiado:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

No obtendrá el código de estado, pero encontrará la nueva URL sin descargar la página completa.

usuario
fuente
A veces, el uso OPTIONSpuede ser una mejor opción, de todos modos solo funciona para fines no generales, etc. el administrador había configurado la redirección de todo el sitio / esquema, como HTTP -> HTTPS
William Leung
12

Puede usar la responseURLpropiedad para obtener el destino de la redirección o verificar si la respuesta se obtuvo finalmente de una ubicación que acepta.
Esto, por supuesto, significa que el resultado se obtiene de todos modos, pero al menos puede obtener la información necesaria sobre el destino de la redirección y, por ejemplo, detectar las condiciones en las que le gustaría descartar la respuesta.

Roland Pihlakas
fuente
11

No, no hay ningún lugar en la API expuesto por XMLHttpRequest que le permita anular su comportamiento predeterminado de seguir un 301 o 302 automáticamente.

Si el cliente está ejecutando IE en Windows, puede usar WinHTTP en su lugar para configurar una opción para evitar ese comportamiento, pero esa es una solución muy limitante.

AnthonyWJones
fuente