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

问题描述 投票:0回答:4

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

javascript ajax google-chrome xmlhttprequest
4个回答
19
投票

不存在,这不是你可以阻止的暴露行为。

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

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


6
投票

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

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

    load事件和onload属性;
  • error事件和onerror属性;
  • progress 事件和 onprogress 属性;
  • abort 事件和 onabort 属性;
  • 有人建议使用计时器,也许是一个 ontimeout 属性;
  • 禁用以下重定向的属性;
  • responseXML 用于文本/html 文档;
  • 跨站XMLHttpRequest;
  • responseBody 处理字节流;
  • overrideMimeType 修复 MIME 类型;
  • getRequestHeader() 和removeRequestHeader()。
但是,在所有浏览器都实现这一点之前我不会屏住呼吸。您可能需要使用服务器端代理来处理此问题。只需编写一个简短的脚本,用您最喜欢的服务器端语言/框架执行

HEAD

 请求,然后使用 Ajax 来查询此服务。您还可以通过代理向第三方域发出请求,这是一个积极的副作用。


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

-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 测试并找到这个数字,或者从这个主题中找到它:

在 Chrome 中,有多少重定向是“太多”?

如果有帮助就很高兴:)

© www.soinside.com 2019 - 2024. All rights reserved.