是否可以发送xhr HTTP HEAD请求以仅获取第一个请求的标头响应,而不是像重定向一样自动跟随301,302?我只对获取网址的新位置感兴趣。例如:
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似乎指明应该遵循请求,有没有办法阻止它?
答案 0 :(得分:18)
没有,这不是暴露的行为,你可以停止。
这是因为the spec you linked already,指定的行为是XmlHttpRequest应该透明地跟随重定向......不幸的是,并且不是以你可以阻止的方式。
这种方式是尝试让事情变得更容易,如果资源移动等等......但是当设计和规范布局时,所有这些重定向服务都不在那里。没有强烈需要任何其他行为或能力来阻止它,我认为有很多重定向到网络,我们不会看到添加的能力,但谁知道每个浏览器何时会支持它。
答案 1 :(得分:6)
W3C规范要求自动跟踪重定向,如@Nick suggested in the other answer。但是,禁用重定向的属性为considered by the W3C for a future version of this specification:
此规范不包括为本规范的未来版本考虑的以下功能:
- 加载事件和onload属性;
- 错误事件和onerror属性;
- 进度事件和onprogress属性;
- 中止事件和onabort属性;
- 建议定时器,也许是ontimeout属性;
- 禁用以下重定向的属性;
- 用于text / html文档的responseXML;
- 跨站点XMLHttpRequest;
- responseBody处理字节流;
- overrideMimeType以修复MIME类型;
- getRequestHeader()和removeRequestHeader()。
但是,在所有浏览器实施之前,我都不会屏住呼吸。您可能希望使用服务器端代理来处理此问题。只需编写一个简短的脚本,在您喜欢的服务器端语言/框架中执行HEAD
请求,然后使用Ajax查询此服务。您还可以通过代理向第三方域请求作为积极的副作用。
答案 2 :(得分: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();
答案 3 :(得分:-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的数字,或者从这个主题中找到它:In Chrome, how many redirects are "too many"?
如果有帮助,我很高兴:)