确定jQuery .ajax()将一串重定向解析为

时间:2011-07-20 19:51:30

标签: javascript jquery ajax http redirect

我知道自动跟踪重定向,并且我很少/无法控制该过程。这很好,但我仍然对我的请求最终结束的地方非常感兴趣。是否有可能看到我的请求最终到底是什么网址?

想要依赖返回的HTML本身告诉我我在哪里。

示例代码:

var originalURL = '/this/will/be/redirected';
$.ajax({
    url: originalURL,
    dataType: "html",
    success: function(data, statusText, jqXHR) {
        var endPointURL = insertMagicHere();
        alert("Our query to " + original + " ended up at " + endPointURL + "!");
    }
});

我在jqXHR中寻找它,但到目前为止没有运气。 (虽然,我对这一切都不熟悉,可能就在我的鼻子底下)

3 个答案:

答案 0 :(得分:4)

据我所知(并且有测试),它唯一可能检测到IF是否有重定向以及有多少重定向(但不是TO在哪里)。

你可以查看我的代码:

var xhr = $.ajax({
  url: originalURL,
  dataType: "html",
  success: function(data, statusText, jqXHR) {
    console.log(data);
    console.log(statusText);
    console.log(jqXHR.getAllResponseHeaders());
  }
});

我的开发机器上的jqXHR.getAllResponseHeaders()输出是这样的:

Date: Fri, 05 Aug 2011 01:29:20 GMT
Server: ...
X-Powered-By: ... 
Content-Length: 5 
Keep-Alive: timeout=15, max=98 
Connection: Keep-Alive 
Content-Type: text/html

Keep-Alive: timeout=15, max=98值得深入了解。 {ONE}重定向导致max=99

max=98没有重定向结果

答案 1 :(得分:1)

XMLHttpRequest.responseXML是一个文档,意味着它具有baseURI属性,该属性将是从中下载数据的位置。主要问题是只有在获得XML文档时才会设置responseXML。在使用overrideMimeType()的Firefox中,尽管在文档中报告了语法错误:

var r = new XMLHttpRequest();
r.open("GET", "http://google.com");
r.overrideMimeType("text/xml");
r.onload = function()
{
  alert(r.responseXML.baseURI);
}
r.send(null);

不幸的是,在Chrome中你需要一个真正的XML文档,overrideMimeType()没有帮助。并且MSIE甚至没有实现这种方法(鉴于确定文档源似乎不可能,这不是一个大问题。)

答案 2 :(得分:0)

我不确定他们使用服务器方面有什么魔力,但是www.longURL.com正在做你正在谈论的事情。

他们的代码向他们的服务器发送请求:                            

他们有一个jquery插件:http://plugins.jquery.com/project/longurl

我不确定如何从中获取中间步骤,但他们的网站包含重定向,因此他们必须找到一些方法来做到这一点,这意味着他们可能有某种方法来实现它。

要使用它,你必须查看他们的jquery插件,以找出他们请求实际数据的位置。

修改

请允许我纠正这个非常不合适的答案:

http://www.longURL.com有一项服务可以扩展缩短的网址。

他们的主网站(在扩展网址时)会跟踪每次重定向,直到您到达目的地为止。

如果你做了他们正在做的事情,你也可以这样做。

不幸的是,我不知道他们正在做什么(除了将他们的请求发送到可能专门监听303s的服务器之外)。

他们的jQuery插件可能有用也可能没用。如果它暴露了重定向,你可以弄清楚如何使用系统,你可以通过他们的服务获得它,否则你可以创建一个缩短的链接到初始链接,并通过他们的服务得到结果...听起来痛苦,但如果你不能/不愿意做服务器的话,那么这可能是你最好的选择。