document.referrer未保存用户上次访问页面,注册后无法跳转回对应博客
问题根源
- 从受保护博客页服务端重定向到注册页时,浏览器会自动将历史记录里的目标博客页条目替换为注册页,因此
history.go(-1)/window.history.back()读取的历史记录本身就存在错误,这是核心诱因。 - 原有本地存储方案的缺陷:
- 变量
protectedReferrerForInsertion定义在if判断块内部,块外调用时会出现未定义报错 - 额外增加了
sessionStorage.alreadyClicked限制,导致跳转目标仅会被存储一次,后续用户访问其他受保护博客页时无法更新存储值 document.referrer在跨域、隐私浏览模式、服务端重定向场景下会返回空值,可靠性极低
- 变量
修复方案
第一步:调整跳转注册逻辑(优先采用)
用户访问需要登录的受保护博客页时,不要直接返回302重定向到注册页,而是将当前博客页的完整路径作为redirect参数拼接在注册页URL后跳转,示例:
用户访问/blog/second-post时,跳转地址改为/register?redirect=/blog/second-post,该方案不受多标签页、刷新操作影响,可靠性最高。
第二步:重写注册页跳转逻辑
// 优先从URL参数中获取跳转目标 function getRedirectTarget() { const urlParams = new URLSearchParams(window.location.search); const redirectParam = urlParams.get('redirect'); // 校验redirect参数为本站路径,避免开放重定向漏洞 if (redirectParam && redirectParam.startsWith('/')) { return redirectParam; } // 参数不存在时降级使用referrer,仍为空则跳转到首页 return document.referrer || '/'; } // 页面加载完成后给返回按钮赋值 document.addEventListener('DOMContentLoaded', () => { const target = getRedirectTarget(); const backBtn = document.querySelector("#back-button-referrer a"); if (backBtn) { backBtn.setAttribute('href', target); // 可按需增加点击后清除存储目标的逻辑 backBtn.addEventListener('click', () => { localStorage.removeItem('protectedReferrer'); }); } });
兜底兼容方案
如果无法调整跳转时带参数的逻辑,可直接修改原有存储逻辑,去掉多余的触发限制:
document.addEventListener('DOMContentLoaded', () => { // 仅在注册页首次加载时存储referrer,刷新操作不覆盖已有值 if (!sessionStorage.getItem('registerPageLoaded')) { const referrer = document.referrer; if (referrer) { localStorage.setItem("protectedReferrer", referrer); } sessionStorage.setItem('registerPageLoaded', 'true'); } const backBtn = document.querySelector("#back-button-referrer a"); if (backBtn) { const target = localStorage.getItem("protectedReferrer") || '/'; backBtn.setAttribute("href", target); } });
内容的提问来源于stack exchange,提问作者Zaeem Javed
相关产品推荐
相关产品推荐

