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

IT技术 javascript ajax google-chrome xmlhttprequest
2021-02-21 04:23:04

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

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个回答

没有,这不是您可以阻止的暴露行为。

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

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

嗨@nick-craver 和 antonj,我认为停止重定向是可能的。请在下面检查我的答案并尝试我的代码。谢谢。
2021-04-27 04:23:04
你好尼克,感谢我们的回答,这对我有帮助。但是我想知道是否有任何方法可以检索重定向指向的最终 URL?
2021-05-15 04:23:04

W3C 规范要求自动遵循重定向,正如@Nick 在另一个答案中所建议的那样然而,W3C正在考虑在本规范的未来版本中禁用重定向的属性

本规范不包括正在考虑用于本规范未来版本的以下功能:

  • 加载事件和 onload 属性;
  • 错误事件和 onerror 属性;
  • progress 事件和 onprogress 属性;
  • abort 事件和 onabort 属性;
  • 已建议使用计时器,可能是 ontimeout 属性;
  • 禁用以下重定向的属性;
  • 文本/html 文档的 responseXML;
  • 跨站 XMLHttpRequest;
  • responseBody 处理字节流;
  • overrideMimeType 修复 MIME 类型;
  • getRequestHeader() 和 removeRequestHeader()。

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

@Blastura:不确定,但我认为不是。
2021-04-27 04:23:04
新的fetch()API 获得了这个功能,但是今天的 API 缺少 XHR 中的一些功能(包括超时和取消)
2021-04-29 04:23:04
这是否在任何浏览器中实现?我最感兴趣的是 google-chrome/webkit 的解决方案/hack。
2021-05-08 04:23:04

现在有可能!至少在 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();
它遵循 URL(加载它),您可以最好地注意到,当它重定向到其他域时,您仍然会在控制台中收到阻止的 CORS 警告
2021-05-07 04:23:04
这实际上遵循重定向并检索结果 URL 中的数据,对吗?这只是让您了解您后来被重定向了,除非我遗漏了什么?
2021-05-08 04:23:04

停止重定向是POSSIBLE

当重定向过多时,主流浏览器将停止重定向。在 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中,有多少重定向“太多”了?

很高兴如果有帮助:)

那是jquery还是php?(玩笑)
2021-05-18 04:23:04