tipos redirectmatch redireccionar redireccionamiento redireccion origin métodos lista htaccess has habilitar from estados estado errores error dominio códigos control codigo chrome been allow javascript ajax google-chrome xmlhttprequest

javascript - redirectmatch - ¿Es posible que las solicitudes de XHR HEAD no sigan las redirecciones(301 302)?



redirectmatch 301 (4)

¿Es posible enviar una solicitud xhr HTTP HEAD para obtener solo la respuesta del encabezado de la primera solicitud y no seguir automáticamente 301, 302 como redirecciones? Sólo estoy interesado en obtener la nueva ubicación de la url. Ejemplo:

var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(data) { if (xhr.readyState == 4) { if (xhr.status == 301 || xhr.status == 302) { // Get new location url don''t GET it } } }; xhr.open(''HEAD'', url, true); xhr.send();

http://www.w3.org/TR/XMLHttpRequest/#infrastructure-for-the-send-method parece especificar que se deben seguir las solicitudes, ¿hay alguna manera de detener esto?


¡Y ahora es posible! Al menos en los navegadores Firefox y Chrome.

Estaba casi desesperado cuando encontré esa respuesta: https://.com/a/8056313/995007

Ex:

var xhttp = new XMLHttpRequest(); xhttp.onload = function() { console.log(xhttp.responseURL); // Here you are! }; xhttp.open(''GET'', ''https://www.ddd.com/news'', true); xhttp.send();


La especificación W3C requiere que las redirecciones se sigan automáticamente, como @Nick sugirió en la otra respuesta . Sin embargo, el W3C está considerando una propiedad para deshabilitar las redirecciones para una versión futura de esta especificación :

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

  • evento de carga y atributo de carga;
  • evento de error y atributo onerror;
  • evento de progreso y atributo de progreso;
  • evento abort y atributo onabort;
  • Se han sugerido temporizadores, tal vez un atributo ontimeout;
  • Propiedad para deshabilitar siguientes redirecciones;
  • responseXML para documentos de texto / html;
  • Cross-site XMLHttpRequest;
  • responseBody para hacer frente a los flujos de bytes;
  • overrideMimeType para arreglar los tipos MIME;
  • getRequestHeader () y removeRequestHeader ().

Sin embargo, no contendría la respiración hasta que esto sea implementado por todos los navegadores. Es posible que desee utilizar un proxy del lado del servidor para manejar esto. Simplemente escriba una secuencia de comandos breve para realizar una solicitud HEAD en su lenguaje / marco del lado del servidor favorito y luego use Ajax para consultar este servicio. También podría realizar solicitudes a dominios de terceros a través del proxy como un efecto secundario positivo.


No hay, esto no es un comportamiento expuesto que puedes detener.

Debido a http://www.w3.org/TR/XMLHttpRequest/#infrastructure-for-the-send-method , el comportamiento especificado es que XmlHttpRequest debe seguir las redirecciones de forma transparente ... desafortunadamente, bajo las coberturas, y no de una manera que puedas prevenir.

Esta es la forma de intentar y hacer las cosas más fáciles, si los recursos se mueven, etc. Pero cuando se diseñó y se establecieron las especificaciones, todos estos servicios de redirección no estaban disponibles. Simplemente no había una gran necesidad de ningún otro comportamiento o capacidad para evitarlo, creo que con la cantidad de redireccionamientos que llegan a la web no veremos la capacidad agregada, pero quién sabe cuándo cada navegador lo admitirá.


Detener la redirección es POSIBLE .

Los navegadores principales detendrán la redirección cuando haya demasiadas redirecciones. En Chrome obtendrás un error ERR_TOO_MANY_REDIRECTS después de 20 veces redirigir. Código de prueba como este (guárdelo como redir.php):

<?php $times = isset($_GET[''t'']) ? intval($_GET[''t'']) : 1; if ( $times < 20) { header("Location: redir.php?t=".strval($times+1)); } else { header("Location: http://the.final.target.url/which.will.give.you.a.301.header.but.you.do.not.want.to.follow.it"); }

A continuación, encontrará que la redirección se detendrá como lo exceptuamos. También funciona con xhr y JS común, como (new Image).src="some.url" .

Una cosa más, la limitación máxima de redirecciones es diferente entre los navegadores. Puede probar y encontrar el número redir.php usted mismo, o encontrarlo en este tema: En Chrome, ¿cuántos redireccionamientos son "demasiados"?

Me alegro si es útil :)