当对 $.ajax 的响应为 301 时,我可以通过编程方式获取新 URL 吗?

Posted

技术标签:

【中文标题】当对 $.ajax 的响应为 301 时,我可以通过编程方式获取新 URL 吗?【英文标题】:When a response to $.ajax is 301, can I programmatically get the new URL? 【发布时间】:2012-05-10 14:36:39 【问题描述】:

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

我有一个网站,其中包含来自旧版本的大量旧版 URL,这些旧版 URL 对正确的新 URL 返回 301 响应。

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

我一直在 firebug 控制台玩这个:

    $.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 吗?到目前为止,答案似乎是“否”。

【问题讨论】:

您可能想阅读这篇文章:***.com/a/1534662/64741 Determining what jQuery .ajax() resolves a string of redirects to的可能重复 【参考方案1】:

我通过使用实际的 XHR 对象而不是 jquery 的 ajax 方法从这个答案中找到了一种方法:https://***.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。

【讨论】:

这个解决方案的问题是它只有在响应是 html 内容时才有效(也许 XML 也是?)。如果您收到 JSON、纯文本、图像,什么都没有等,这将不起作用。【参考方案2】:

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

Ajax Redirection Handling 和 Prevent redirection of Xmlhttprequest

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

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

更新:

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

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);
        
    );

【讨论】:

当您说“响应 URL”时,您是指我的请求最终被重定向到的 URL 吗?我怎样才能访问它? 是的,我对原始 URL 的更多思考感到困惑。在success方法里面试试this.url。我已经相应地更新了答案。 很遗憾,this.url 包含我已经知道的旧 URL。 抱歉更新晚了。试试jqxhr.getResponseHeader("X-MYAPP-PATH"),然后告诉我进展如何。 抱歉真的更新晚了。 jqxhr.getResponseHeader("X-MYAPP-PATH") 仅在服务器实际发送该标头时才有效。如果您无法控制返回的标头,那么这对您不起作用。【参考方案3】:

查看 XMLHttpRequest.responseURL

【讨论】:

以上是关于当对 $.ajax 的响应为 301 时,我可以通过编程方式获取新 URL 吗?的主要内容,如果未能解决你的问题,请参考以下文章

表单提交响应 301 或 302

没有 Location 标头的 301 http 响应

AJAX | HTTP状态码

如何从 jQuery.ajax 获取响应状态码?

AJAX简述

luaSocket HTTP 请求总是以重定向响应(301 或 302)