繁体   English   中英

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

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

是否可以发送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似乎指定应该遵循请求,有没有办法阻止这个?

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

这是因为您已经链接的规范 ,指定的行为是XmlHttpRequest应该透明地遵循重定向......不幸的是,并且不是以您可以阻止的方式。

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

W3C规范要求自动跟踪重定向,正如@Nick在另一个答案中建议的那样 但是,W3C正在考虑禁用重定向的属性,以用于此规范的未来版本

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

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

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

现在有可能! 至少在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();

停止重定向是可能的

当重定向过多时,主流浏览器将停止重定向。 在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的数字,或者从这个主题中找到它: 在Chrome中,有多少重定向是“太多”?

很高兴,如果有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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