是否有可能XHR HEAD请求不遵循重定向(301 302)

时间:2010-09-29 10:17:18

标签: javascript ajax google-chrome xmlhttprequest

是否可以发送xhr HTTP HEAD请求以仅获取第一个请求的标头响应,而不是像重定向一样自动跟随301,302?我只对获取网址的新位置感兴趣。例如:

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似乎指明应该遵循请求,有没有办法阻止它?

4 个答案:

答案 0 :(得分:18)

没有,这不是暴露的行为,你可以停止。

这是因为the spec you linked already,指定的行为是XmlHttpRequest应该透明地跟随重定向......不幸的是,并且不是以你可以阻止的方式。

这种方式是尝试让事情变得更容易,如果资源移动等等......但是当设计和规范布局时,所有这些重定向服务都不在那里。没有强烈需要任何其他行为或能力来阻止它,我认为有很多重定向到网络,我们不会看到添加的能力,但谁知道每个浏览器何时会支持它。

答案 1 :(得分:6)

W3C规范要求自动跟踪重定向,如@Nick suggested in the other answer。但是,禁用重定向的属性为considered by the W3C for a future version of this specification

  

此规范不包括为本规范的未来版本考虑的以下功能:

     
      
  • 加载事件和onload属性;
  •   
  • 错误事件和onerror属性;
  •   
  • 进度事件和onprogress属性;
  •   
  • 中止事件和onabort属性;
  •   
  • 建议定时器,也许是ontimeout属性;
  •   
  • 禁用以下重定向的属性;
  •   
  • 用于text / html文档的responseXML;
  •   
  • 跨站点XMLHttpRequest;
  •   
  • responseBody处理字节流;
  •   
  • overrideMimeType以修复MIME类型;
  •   
  • getRequestHeader()和removeRequestHeader()。
  •   

但是,在所有浏览器实施之前,我都不会屏住呼吸。您可能希望使用服务器端代理来处理此问题。只需编写一个简短的脚本,在您喜欢的服务器端语言/框架中执行HEAD请求,然后使用Ajax查询此服务。您还可以通过代理向第三方域请求作为积极的副作用。

答案 2 :(得分:0)

现在有可能!至少在Firefox和Chrome浏览器中

当我找到答案时,我几乎绝望了:https://stackoverflow.com/a/8056313/995007

例如:

    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();

答案 3 :(得分:-11)

停止重定向可能

当重定向过多时,主流浏览器将停止重定向。在Chrome中,重定向20次后会出现错误ERR_TOO_MANY_REDIRECTS。像这样测试代码(保存为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");
}

然后您会发现重定向将在我们排除时停止。也适用于xhr和常见JS,如(new Image).src="some.url"

还有一件事,浏览器之间的最大重定向限制是不同的。你可以自己测试并找到redir.php的数字,或者从这个主题中找到它:In Chrome, how many redirects are "too many"?

如果有帮助,我很高兴:)