防止Xmlhttprequest重定向


112

发送XMLHttpRequest-s时是否可以防止浏览器跟随重定向(即,获取重定向状态代码并自己处理)?

Answers:


102

不符合XMLHttpRequest对象的W3C标准(添加了重点):

如果响应是HTTP重定向:

如果Location头传达的URL的原点与XMLHttpRequest的原点是相同的原点,并且重定向不违反无限循环预防措施,请在遵循相同原点请求事件规则的情况下透明地遵循重定向

他们正在考虑将其发布:

本规范不包括在本规范的将来版本中考虑的以下功能:

  • 禁用以下重定向的属性;

但是最新的规范不再提及这一点。


5
荒谬的是透明重定向涉及覆盖原始请求中设置的某些HTTP标头。具体来说,如果将“ Accept”标头设置为特定的内容类型,则在重定向后,Firefox无法包含该标头(这使得使用此标头开发完全基于REST的Web服务变得更加困难。叽)。
ruquay 2011年

1
一些更多的搜索为我带来了一个相当古老的错误报告:bugzilla.mozilla.org/show_bug.cgi?
id=401564

2
同意,完全重做设计缺陷。
Rasive

35

新的Fetch API支持不同的重定向处理模式:followerrormanual,但是取消重定向后,我找不到一种查看新URL或状态代码的方法。您可以停止重定向本身,然后它看起来像一个错误(空响应)。如果这就是您所需要的,那就很好了。你也应该知道,通过该API提出的请求是不可取消的还没有 他们现在。

至于XMLHttpRequest,您可以HEAD通过服务器检查URL是否已更改:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

您不会获得状态码,但是会找到新的URL,而无需从中下载整个页面。


有时使用OPTIONS可能是一个更好的选择,无论如何仅适用于非一般目的,等等。管理员已配置了重定向整个站点/架构,例如HTTP-> HTTPS
William Leung


11

不,您在XMLHttpRequest公开的API中没有任何地方可以让您覆盖其默认行为,即自动遵循301或302。

如果客户端在Windows上运行IE,则可以使用WinHTTP来设置一个选项来防止该行为,但这是一个非常有限的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.