2010-09-29 69 views
21

是否可以发送xhr HTTP HEAD请求来仅为第一个请求获取标头响应,而不是像重定向那样自动跟随301,302?我只对获取网址的新位置感兴趣。例如:XHR 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

[XMLHttpRequest的的防止重定向]的可能的复制(HTTP://计算器.com/questions/228225/prevent-redirection-of-xmlhttprequest) – user 2016-02-15 17:07:36

回答

16

有没有,这是不可暴露的行为,你可以停止。

这是因为the spec you linked already,指定的行为是应该的XmlHttpRequest透明后续下盖重定向...不幸的是,并没有一个办法可以阻止。

这种方式可以让事情变得更容易,如果资源移动等等,但是当它的设计和规范制定出来时,所有这些重定向服务都不在那里。对于任何其他行为或能力都没有强烈的需求来阻止它,我认为尽可能多的重定向到达网页,我们不会看到增加的能力,但是谁知道每个浏览器何时会支持它。

+0

你好尼克,thx为我们的答案,这帮了我。不过,我想知道是否有任何方法检索重定向所指向的最终URL? – ehretf 2013-02-03 15:14:02

+0

嗨@ nick-craver和antonj,我认为停止重定向是可能的。请检查我的答案,并尝试使用我的代码。谢谢。 – Alix 2013-07-14 08:13:01

6

W3C规范要求自动遵循重定向,如@Nick suggested in the other answer。然而禁用重定向一个属性被considered by the W3C for a future version of this specification

本规范不包括正在考虑用于本说明书中的未来版本的以下功能:

  • 负载事件和onload属性;
  • 错误事件和onerror属性;
  • 进度事件和进度属性;
  • 中止事件和onabort属性;
  • 定时器已被建议,可能是ontimeout属性;
  • 属性禁用下列重定向;
  • text/html文档的responseXML;
  • 跨站点XMLHttpRequest;
  • responseBody处理字节流;
  • overrideMimeType修复MIME类型;
  • getRequestHeader()和removeRequestHeader()。

但是,我不会屏住呼吸,直到所有浏览器都实现此功能。您可能想要使用服务器端代理来处理此问题。只需编写一个简短的脚本即可在您喜欢的服务器端语言/框架中执行HEAD请求,然后使用Ajax查询此服务。您还可以通过代理向第三方域请求作为积极的副作用。

+0

这是否在任何浏览器中实现?我主要对google-chrome/webkit的解决方案/黑客感兴趣。 – antonj 2010-09-29 10:50:09

+0

@Blastura:不确定,但我不认为是。 – 2010-09-29 10:51:33

+0

新的'fetch()'API获得了这个特性,但是这个API在XHR中缺少一些特性(包括超时和取消) – EricLaw 2016-03-24 19:45:21

-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"?

高兴,如果有帮助:)

+0

是jQuery还是php? _(玩笑)_ – 2014-07-12 01:12:38

1

现在它是可能的!至少在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();