14

当对 xhr 请求的响应为 301 时,有没有办法获取最终重定向到的 URL?

我有一个站点,其中包含来自旧版本的大量旧版 URL,它们返回 301 响应到正确的新 URL。

出于实用目的,我希望能够向旧 URL 发出请求,并能够检索新 URL,即将请求发送到“/oldpage.aspx?foo=someParam”,取回新 URL“/arbitaryNewPageName /someParam”。

我一直在萤火虫控制台玩这个:

    $.ajax({
            url: "/oldpage.aspx?foo=someParam", 
            success: function(response, status, jqxhr){
            //poking around, trying to get the new URL, "/arbitraryNewPage/someParam"
                console.log(jqxhr.getAllResponseHeaders());
                console.log(jqxhr);
            },
            beforeSend: function(jqxhr, settings){
                console.log(jqxhr);
                console.log(settings);
            }
        });

我可以在 firebug 中看到,当这段代码运行时,它对“/oldpage.aspx?foo=someParam”执行一次 GET,并获得 301 响应,然后对“/arbitaryNewPageName/someParam”执行另一个 GET。

对于第一个请求,我在响应标头的 Location 值中看到了重定向的 URL。不幸的是,第二个请求是传递给 $.ajax.success 函数的,它在请求标头的 Referrer 值中只有重定向的 URL。

是否有办法拦截对第一个响应的响应,或者查看第二个请求的请求标头?

编辑:感谢大家的回复。我想我需要提供一些背景知识来澄清我到底在寻找什么。

一位业务用户要求我创建一个将旧 URL 与新 URL 相关联的列表。由于我已经实现了一种将旧 URL 重定向到服务器上的新 URL 的方法,我希望能够完成这项工作并创建一个脚本,将请求放置到旧 URL 并获取请求被重定向到的 URL。像这样的东西:

for (var i = 0; i < arrayOfLegacyUrls.length; i++)
{
    $.ajax({
            url: arrayOfLegacyUrls[i], 
            success: function(response, status, jqxhr){
                var newUrl = "???"; //do magic to get URL that request was redirected to

                writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl);
            }
        });
}

我的问题的症结在于:我可以从 XHR 获取我的请求重定向到的 URL 吗?到目前为止,答案似乎是否定的。

4

3 回答 3

1

我从这个答案中找到了一种通过使用实际的 XHR 对象而不是 jquery 的 ajax 方法来做到这一点的方法:https ://stackoverflow.com/a/7015798/194099

var r = new XMLHttpRequest();
r.open("GET", "http://mysite.com/legacyUrl.aspx?bla=bla");
r.overrideMimeType("text/xml");
r.onload = function()
{
  alert(r.responseXML.baseURI); //gets the URL the request was redirected to! huzzah!
}
r.send(null);

有了这个,我可以向我知道将返回 301 的 URL 发出请求,并获取请求被重定向到的 URL。

于 2012-05-01T14:01:01.573 回答
1

它的目的是透明地工作,至少这是这里建议的:

Ajax 重定向处理防止 Xmlhttprequest 重定向

您可以做的一件事是将 URL 作为上下文参数传递给 AJAX 调用,然后在成功时将响应 URL 与上下文对象的 URL 属性进行比较。

有关上下文的信息,请参见此处:http: //api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

更新:

真正棘手的是新 URL,this.url如果您不覆盖 econtext,我认为您可以通过调用来获取它。

for (var i = 0; i < arrayOfLegacyUrls.length; i++)
{
    $.ajax({
        url: arrayOfLegacyUrls[i], 
        success: function(response, status, jqxhr){
            var newUrl = jqxhr.getResponseHeader("X-MYAPP-PATH");
            writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl);
        }
    });
}
于 2012-05-01T00:25:17.037 回答
1

查看 XMLHttpRequest.responseURL

于 2014-07-03T00:05:25.830 回答