简体   繁体   中英

Is it possible for XHR HEAD requests to not follow redirects (301 302)

Is it possible to send an xhr HTTP HEAD request to only get header response for the first request and not automatically follow 301, 302 like redirects? I'm only interested in getting the new location of the url. Example:

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 seems to specify that requests should be followed, is there a way to stop this?

There isn't, this isn't exposed behavior you can stop.

It's because of the spec you linked already , the specified behavior is that XmlHttpRequest should transparently follow redirects...under the covers unfortunately, and not in a way you can prevent.

It's this way to try and make things easier, if resources move, etc...but when it was designed and the spec laid out, all these redirection services weren't out there. There just wasn't a strong need for any other behavior or ability to prevent it, I think with as many redirects hitting the web not we'll see the ability added, but who knows when every browser would support it.

The W3C specification requires that redirects are followed automatically, as @Nick suggested in the other answer . However a property to disable redirects is being considered by the W3C for a future version of this specification :

This specification does not include the following features which are being considered for a future version of this specification:

  • load event and onload attribute;
  • error event and onerror attribute;
  • progress event and onprogress attribute;
  • abort event and onabort attribute;
  • Timers have been suggested, perhaps an ontimeout attribute;
  • Property to disable following redirects;
  • responseXML for text/html documents;
  • Cross-site XMLHttpRequest;
  • responseBody to deal with byte streams;
  • overrideMimeType to fix up MIME types;
  • getRequestHeader() and removeRequestHeader().

However, I wouldn't hold my breath until this is implemented by all browsers. You may want to use a server-side proxy to handle this. Simply write a short script to do a HEAD request in your favourite server-side language/framework, and then use Ajax to query this service. You would also be able to do requests to third-party domains through the proxy as a positive side-effect.

And now it is possible! at least in Firefox and Chrome browsers

I was almost desperate, when I found that answer: https://stackoverflow.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();

Stop the redirection is POSSIBLE .

Major browsers will stop redirect when there are too many redirections. In chrome you will got an error ERR_TOO_MANY_REDIRECTS after 20 times redirect. Test code like this (save it as 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");
}

Then you will find the redirection will stopped as we excepted. Also works with xhr and common JS, like (new Image).src="some.url" .

One more thing, the max redirections limitation is different between browsers. You can test and find the number by redir.php yourself, or find it from this topic: In Chrome, how many redirects are "too many"?

Glad if helpful :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM