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)的主要内容,如果未能解决你的问题,请参考以下文章
带有跨域重定向的 Safari xhr (AJAX) 请求失败
Google OAuth2:重定向已被 CORS 政策阻止:请求需要预检,不允许遵循跨域重定向