【问题标题】:Determining what jQuery .ajax() resolves a string of redirects to确定 jQuery .ajax() 将重定向字符串解析为什么
【发布时间】:2011-10-09 16:54:20
【问题描述】:

我知道重定向是自动进行的,并且我几乎/无法控制该过程。这很好,但我仍然对我的请求最终的结果非常感兴趣。是否可以看到我的请求最终在哪个 url 结束?

我确实想依靠返回的 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 中寻找它,但到目前为止还没有运气。 (不过,我对这一切都很陌生,可能就在我眼皮子底下)

【问题讨论】:

  • this existing StackOverflow question 能帮你解决吗?可悲的是,如果不进行某种服务器端修改来捕获重定向的位置,似乎是没有办法的。
  • 同意。根据 XHR 规范,重定向是静默处理的。在我的测试中,302 甚至不会触发 readystatechange!
  • 简短的回答:不仅仅在 jQuery 中。上次我尝试时,即使注册所有可用的事件侦听器也不允许我检测到重定向。你可能想要一个非跨浏览器的解决方案(即一个小的 Flash 电影和可能的 crossdomain.xml)。
  • @chuck:你这样做的真正意图是什么,如果你能告诉我们,可能还有其他方法可以做到这一点。您是否正在为未经授权的页面进行重定向??
  • 您最好的选择似乎是通过中间服务器路由所有此类请求,跟踪重定向,然后将响应和 endPointURL 返回到客户端。也就是说,如果预期的应用程序完全是客户端的,那可能是不切实际的。

标签: javascript jquery ajax http redirect


【解决方案1】:

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

你可以看看我的代码:

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 值得深入了解。没有重定向导致max=99,而一个重定向导致max=98

【讨论】:

  • 这是同一台服务器上的重定向?我怀疑这可能是服务器减少了其可用连接数以支持 Keep-Alive 。使用此方法可能无法检测到重定向到其他服务器或与不支持 Keep-Alive 的服务器的交互。不过,我很可能是错的……我只是在读 Keep-Alive。
  • @JAAulde:是的,测试的重定向在同一台服务器上。我不知道使用不同的服务器会有什么结果。
【解决方案2】:

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

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 甚至没有实现这个方法(这没什么大不了的,因为确定文档来源似乎是不可能的)。

【讨论】:

  • 这很接近,但并没有完全让我到达那里。尤其是因为跨浏览器的兼容性对我的案例来说实际上很重要。
【解决方案3】:

我不确定他们在服务器端使用了什么魔法,但 www.longURL.com 可以满足您的要求。

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

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

我不确定如何从中获取中间步骤,但他们的网站包含重定向,所以他们一定想出了某种方法,这意味着他们可能有某种方法。

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

编辑

请允许我纠正这个极其不充分的答案:

http://www.longURL.com 具有扩展缩短 URL 的服务。

他们的主要网站(在扩展 URL 后)会跟踪每次重定向,直到您到达最终目的地。

如果你做了他们正在做的任何事情,你也许可以做同样的事情。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多