如何使用 $.get() 检测服务器重定向

Posted

技术标签:

【中文标题】如何使用 $.get() 检测服务器重定向【英文标题】:How to detect a server redirect with $.get() 【发布时间】:2014-04-01 06:56:07 【问题描述】:

没有重复的问题

这个问题不是上述问题之一的重复,因为我对服务器响应无法控制,就像上面其他两个问题一样。


我使用$.get将外部文档的内容加载到当前网站中。

但是,我需要此外部文档的最终 URL。在原始 URL 被重定向 (302) 到不同 URL 的情况下,我需要新 URL。

能否使用 jQuery $.get 方法从加载的文档(302 重定向后)获取最终 URL?


更新

根据下面的反馈,我将我的代码更新为这个,但我仍然没有得到最终的 URL:

$.get(url, function(html, status, xhr)
    console.log(xhr.getResponseHeader('TM-finalURL')); // result: null
);

使用xhr.getAllResponseHeaders() 记录所有响应标头会给我(对于具有 302 重定向的页面)以下结果:

Pragma: no-cache
Date: Fri, 28 Feb 2014 15:30:22 GMT
Server: Apache
X-Powered-By: php/5.3.28
Transfer-Encoding: chunked
Content-Type: text/html
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Expires: Thu, 19 Nov 1981 08:52:00 GMT

但没有最终到达网址。我是不是理解错了?

【问题讨论】:

检查使用:success: function(data, status, xhr) console.log(xhr.getAllResponseHeaders()); 然后尝试:xhr.getResponseHeader(key) 我不确定应该针对哪个“键”进行重定向 ^^ 那-jqXHR.getResponseHeader("TM-finalURL")(我相信) @Archer 不,我的错,你之前的评论没看够 那么你没有办法检测到重定向。它对 javascript 完全透明。 @SimonFerndriger 正如其他人所说,这是不可能的,因为它发生在 JavaScript 被通知之前。通常这是通过检测服务器端来解决的,它是一个 ajax 调用,并发送一个标头告诉它重定向。如果它是一个总是被重定向到的单个页面(想想登录页面),你可以做一个非常肮脏的修复,并检查返回内容是否有一些决定因素,它现在在登录页面上。但我不推荐这个。 【参考方案1】:

查看 XHR specification,您会发现它不是为灵活而构建的。所有重定向都是透明处理的:

如果响应的 HTTP 状态码为 301,则 302 ... 透明地跟随重定向

在 JavaScript 中不会使用中间状态代码触发任何事件。 JavaScript 只会被通知最终的 HTTP 状态和返回的数据,因为这是应该提供的:

收到所有 HTTP 标头后,同步标志为 未设置,并且响应的 HTTP 状态代码是 not 301 之一, 302、303、307 和 308

【讨论】:

非常感谢您一劳永逸地解决这个问题。 我从我不确定这是否包含原始问题背后的整个想法的地方找到了一些东西。我也不确定这个脚本是基于客户端还是外部服务器。但是我想分享给你我发现的东西。如果它根本不合规,请忽略。 github.com/olalonde/follow-redirects @HenryW,这是一个 Node.js 模块,所以它只在服务器端运行。

以上是关于如何使用 $.get() 检测服务器重定向的主要内容,如果未能解决你的问题,请参考以下文章

通过来自 React App 的 GET 请求从 express 服务器重定向到外部 URL

node服务器重定向

如何使用命名 URL 映射从控制器重定向?

如何使用 React Router V4 从 axios 拦截器重定向?

如何使用浏览器重定向创建 Facebook 风格的应用内身份验证?

如何从 C# 控制器重定向到 URL(带有自定义标头)