本文探讨了JavaScript中document.referrer在HTTPS向HTTP跳转时丢失的问题,并提供了基于window.name的替代方案。通过对比IE6至IE9及Firefox、Chrome等主流浏览器的测试结果,详细列出了地址栏输入、书签、超链接、JS跳转及Meta刷新等不同操作下referrer的获取情况,指出JS跳转和Meta跳转易导致来源信息丢失,建议在实际开发中谨慎使用。
document.referrer跨协议跳转失效问题
此前曾探讨如何利用 JavaScript 获取页面来源,实现这一目标的基本方法是调用 document.referrer。然而在实际业务场景中,该属性常出现意外行为,此处对此进行简要梳理。
首要问题是当页面从 HTTPS 跳转至 HTTP 时,document.referrer 的值往往为空。出于安全考量,许多网站的关键页面(如淘宝登录页)均强制使用 HTTPS 协议。若未登录用户从页面 A(HTTP)点击链接进入页面 B(HTTP),而页面 B 要求登录,系统会先重定向至 HTTPS 登录页,验证成功后再跳回页面 B。此时在页面 B 中无法获取到 document.referrer。这意味着,若访问路径中同时包含 HTTP 和 HTTPS 页面,referrer 信息将在从 HTTPS 跳转至 HTTP 的环节中断,导致无法完整还原用户访问路径。
该现象源于浏览器的安全策略,单纯依靠 JavaScript 难以直接解决。一种迂回方案是利用 window.name:在 HTTPS 页面中将当前 URL 写入 window.name,随后在后续的 HTTP 页面中读取该值,以此传递来源信息。
多浏览器环境下的referrer行为测试
除上述跨协议场景外,其他页面跳转是否均能正常获取 document.referrer?经检索发现,现有资料(如文中提到的链接)整理并不全面,例如未涵盖 IE6 等老旧浏览器。因此,笔者在虚拟机中部署了多种浏览器版本进行实测(过程较为繁琐),具体结果如下表所示:
不同操作下的浏览器兼容性结果
| 操作 | IE6 | IE7 | IE8 | IE9 | Firefox | Chrome | Opera | Safari |
|---|---|---|---|---|---|---|---|---|
| 直接在地址栏输入URL | “” | “” | “” | “” | “” | “” | “” | “” |
| 从书签访问URL | “” | “” | “” | “” | “” | “” | “” | “” |
| 从页面A点击超链接,跳转到页面B(target=”_self”) | √ | √ | √ | √ | √ | √ | √ | √ |
| 从页面A点击超链接,跳转到页面B(target=”_blank”) | √ | √ | √ | √ | √ | √ | √ | √ |
| 从页面A右键单击超链接,在新标签页中打开页面B | - | √ | √ | √ | √ | √ | √ | “” |
| 从页面A右键单击超链接,在新窗口中打开页面B | √ | √ | √ | √ | √ | √ | √ | “” |
| 拖动链接到地址栏 | “” | 无法拖动 | 无法拖动 | “” | “” | “” | “” | “” |
| 拖动链接到标签栏 | - | “” | “” | “” | “” | “” | “” | “” |
| 使用浏览器的前进、后退按钮 | √ | √ | √ | √ | √ | √ | √ | √ |
| JS 修改 location.href | “” | “” | “” | √ | √ | √ | √ | √ |
| JS 使用 window.open | “” | “” | “” | “” | √ | √ | √ | √ |
| 服务器重定向(302跳转) | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 | 定向之前的页面 |
| 页面 Meta Refresh | “” | “” | “” | “” | “” | 转向页 | 转向页 | 转向页 |
表中“√”代表能正常获取 referrer,空值代表 referrer 为空。
测试中除 IE 系列外,其余浏览器均使用官网最新可用版本。Safari 同时测试了 Windows 和 Mac 版本,结论一致。
部分场景未纳入测试,例如点击 Flash 链接跳转时各浏览器是否能保持 referrer 等。
需要注意的异常情况
表中多数结果符合预期,但仍有几处需特别注意:
1. Safari 中右键打开链接会丢失 referrer; 2. IE 中修改 location.href 或使用 window.open 打开页面会丢失 referrer(IE 9 略有例外,使用 location.href 跳转不丢失); 3. 使用 Meta 标签跳转时,IE 和 Firefox 下会丢失 referrer。
综上结论:若需通过 document.referrer 采集页面访问来源,应避免使用 JS 跳转或打开新窗口,同时也避免使用 Meta 跳转。