Javascript 确定jQuery.ajax()解析到的重定向字符串
我知道重定向是自动执行的,我对这个过程几乎没有控制权。这很好,但我仍然对我的请求的最终结果非常感兴趣。是否有可能看到我的请求最终到达的url 我不想依靠返回的HTML本身告诉我我在哪里 示例代码:Javascript 确定jQuery.ajax()解析到的重定向字符串,javascript,jquery,ajax,http,redirect,Javascript,Jquery,Ajax,Http,Redirect,我知道重定向是自动执行的,我对这个过程几乎没有控制权。这很好,但我仍然对我的请求的最终结果非常感兴趣。是否有可能看到我的请求最终到达的url 我不想依靠返回的HTML本身告诉我我在哪里 示例代码: var originalURL = '/this/will/be/redirected'; $.ajax({ url: originalURL, dataType: "html", success: function(data, statusText, jqXHR) {
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中四处寻找,但到目前为止运气不好。(虽然,我对这一切都不熟悉,可能就在我眼皮底下)据我所知(并已测试过),只能检测是否有重定向以及重定向的次数(但无法检测到哪里)
您可以查看我的代码:
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=98XMLHttpRequest。responseXML
是一个文档,意味着它有一个baseURI
属性,该属性将是下载数据的位置。主要的问题是,只有在返回XML文档时才会设置responseXML
。在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甚至没有实现这种方法(考虑到确定文档来源似乎是不可能的,这并不是什么大问题)。我不确定他们在服务器端使用了什么魔法,但www.longURL.com做了你们所说的
他们的代码向服务器发送请求:
他们有一个jquery插件:
我不确定如何从中获得中间步骤,但他们的网站包含重定向,因此他们一定找到了某种方法,这意味着他们可能有某种方法来实现
要使用它,您必须查看他们的jquery插件,找出他们在哪里请求实际数据
编辑
请允许我纠正这个极其不充分的答案:
具有扩展缩短URL的服务
他们的主网站(在扩展URL时)跟踪每个重定向,直到您到达最终目的地
如果你做了他们正在做的事情,你可能也能做同样的事情
不幸的是,我不知道他们在做什么(除了将他们的请求发送到可能专门监听303的服务器)
他们的jQuery插件可能有用,也可能无用。如果它公开了重定向,并且你可以找出如何操纵系统,你可能可以通过他们的服务获得它,否则你可以创建一个指向初始链接的缩短链接,并通过他们的服务获得结果……听起来很痛苦,但如果你不能/不愿意做服务器的事情,那这可能是你最好的选择。能帮你解决吗?遗憾的是,如果不进行某种服务器端修改,就无法捕获重定向的位置。同意。根据XHR规范,重定向是静默处理的。在我的测试中,302甚至不会触发readystatechange
!简短回答:不仅仅在jQuery中。上次我尝试时,即使注册所有可用的事件侦听器也不允许我检测重定向。你可能想要一个非跨浏览器的解决方案(即一个小的flash电影,可能还有crossdomain.xml)。@chuck:你这么做的真正目的是什么,如果你能告诉我们,可能还有其他的方法。您正在为未经授权的页面执行重定向吗?似乎您最好通过中间服务器路由所有此类请求,跟踪重定向,然后将响应和端点URL返回到客户端。也就是说,如果预期的应用程序完全是客户端的,这可能是不切实际的。这是同一台服务器上的重定向吗?我怀疑可能是服务器为了保持活动支持而减少了可用连接数。使用此方法可能无法检测到重定向到其他服务器或与不支持保持活动的服务器的交互。不过,我很可能错了……我只是在读《保持活力》。@JAAulde:是的,测试的重定向在同一台服务器上。我不知道使用不同的服务器会有什么结果。这很接近,但并不能让我达到目的。特别是因为跨浏览器的兼容性对我的情况来说实际上有点重要。