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

Posted

技术标签:

【中文标题】XHR HEAD 请求是不是有可能不遵循重定向 (301 302)【英文标题】:Is it possible for XHR HEAD requests to not follow redirects (301 302)XHR HEAD 请求是否有可能不遵循重定向 (301 302) 【发布时间】:2011-04-18 18:03:09 【问题描述】:

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

【问题讨论】:

Prevent redirection of Xmlhttprequest的可能重复 【参考方案1】:

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

因为the spec you linked already,指定的行为是 XmlHttpRequest 应该透明地 遵循重定向...不幸的是,在幕后,而不是您可以阻止的方式。

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

【讨论】:

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

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

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

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

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

【讨论】:

这是在任何浏览器中实现的吗?我最感兴趣的是 google-chrome/webkit 的解决方案/hack。 @Blastura:不确定,但我认为不是。 新的fetch() API 获得了这个特性,但是这个 API 现在缺少 XHR 中的一些特性(包括超时和取消)【参考方案3】:

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

当我找到答案时,我几乎绝望了:https://***.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 处检索数据,对吗?这只是让您了解您之后被重定向,除非我错过了什么? 它跟随 URL(加载它),你可以注意到最好的,当它重定向到另一个域时,你仍然会在控制台中收到阻止的 CORS 警告【参考方案4】:

停止重定向是可能的

当重定向过多时,主要浏览器会停止重定向。在 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"?

如果有帮助很高兴:)

【讨论】:

是 jquery 还是 php? (笑话)

以上是关于XHR HEAD 请求是不是有可能不遵循重定向 (301 302)的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 在重定向时取消 CORS XHR

带有跨域重定向的 Safari xhr (AJAX) 请求失败

Google OAuth2:重定向已被 CORS 政策阻止:请求需要预检,不允许遵循跨域重定向

HTTP2 请求不遵循 JMeter 5.0 中的重定向

服务器返回重定向 (302) 后,iOS 设备上的 AJAX 或 XHR 请求失败,代码为 0

如何配置 Krakend 使其按原样返回 http 重定向响应而不是遵循 http 重定向?