是否可以发送 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似乎指定应该遵循请求,有没有办法阻止这个?
不存在,这不是你可以阻止的暴露行为。
这是因为您已经链接的规范,指定的行为是 XmlHttpRequest 应该透明地遵循重定向......不幸的是,在幕后,而不是您可以阻止的方式。
如果资源移动等,这种方式可以尝试让事情变得更容易......但是当它被设计和规范制定时,所有这些重定向服务都不存在。只是没有强烈需要任何其他行为或能力来阻止它,我认为现在随着网络上有尽可能多的重定向,我们将看到添加的功能,但谁知道什么时候每个浏览器都会支持它。
W3C 规范要求自动遵循重定向,正如 @Nick 在其他答案中建议的那样。然而,W3C 正在考虑在本规范的未来版本中使用禁用重定向的属性:
本规范不包括本规范未来版本中考虑的以下功能:但是,在所有浏览器都实现这一点之前我不会屏住呼吸。您可能需要使用服务器端代理来处理此问题。只需编写一个简短的脚本,用您最喜欢的服务器端语言/框架执行
load事件和onload属性;
- error事件和onerror属性;
- progress 事件和 onprogress 属性;
- abort 事件和 onabort 属性;
- 有人建议使用计时器,也许是一个 ontimeout 属性;
- 禁用以下重定向的属性;
responseXML 用于文本/html 文档;- 跨站XMLHttpRequest;
- responseBody 处理字节流;
- overrideMimeType 修复 MIME 类型;
- getRequestHeader() 和removeRequestHeader()。
HEAD
请求,然后使用 Ajax 来查询此服务。您还可以通过代理向第三方域发出请求,这是一个积极的副作用。
停止重定向是可能。
当重定向过多时,主流浏览器将停止重定向。在 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 测试并找到这个数字,或者从这个主题中找到它: 如果有帮助就很高兴:)