最可靠返回方式是history.back(),它轻量且不依赖URL解析;document.referrer不可靠,仅适用于统计或fallback;确定路径时应通过returnUrl参数传递并校验来源。

点击链接跳回上一页,用 history.back() 最直接
浏览器历史栈存在时,history.back() 是最轻量、最可靠的返回方式。它不依赖 URL 解析,也不需要你手动存来源地址。
常见错误现象:用户点“返回”按钮后跳到首页或 404,其实是用了 window.location.href = document.referrer —— 这个值可能为空、被屏蔽(尤其 HTTPS→HTTP)、或指向外部站点,根本不可控。
- 只在明确需要「模拟浏览器后退」时用
history.back(),比如顶部返回箭头、弹窗里的「上一步」 - 如果历史栈只有一页(比如从书签打开),
history.back()无效,页面无反应——这是正常行为,不是 bug - 不要把它和
history.go(-1)当成两回事,二者效果完全一致,选一个保持代码统一就行
document.referrer 不是可靠 backlink,慎用于跳转
document.referrer 是浏览器自动提供的上一页面 URL,但它受同源策略、隐私设置(如 Firefox 的 referrerpolicy="no-referrer")、HTTPS→HTTP 降级等影响,经常为空或截断。
使用场景有限:仅适合做统计分析(比如埋点记录来源页),或作为 fallback 方案的备选,绝不能当作跳转主逻辑。
- Chrome 和 Edge 在隐私模式下默认清空
document.referrer - 从微信内嵌浏览器、某些 PWA 启动的页面,该值常为
"" - 若真要用,必须加判断:
if (document.referrer && document.referrer.startsWith(window.location.origin)) { ... }
手动生成 backlink:用 URL 参数传 returnUrl
当跳转路径确定(比如登录页、编辑页、支付页),最稳的方式是在链接里带上来源页地址,例如:/login?returnUrl=%2Fsettings%2Fprofile。
服务端或前端解析这个参数,跳转时做校验再重定向,避免开放重定向漏洞。
- 务必对
returnUrl做白名单校验或同域检查,否则可能被利用跳转到钓鱼页 - 前端解码要用
decodeURIComponent(),否则带斜杠的路径会出错 - Vue/React 路由中,推荐用
router.push({ path: returnUrl })而非直接赋值window.location.href,避免丢失路由状态
锚点跳转不是 backlink,别混淆 id 和来源跳转
看到「引用跳转」就写 #section2,这是典型误解。# 锚点只是页面内定位,不改变历史记录,也不提供「返回来源」能力。
如果你要实现「点这里回到上一节引用处」,得自己存位置:比如点击时记录 scrollY 或元素 offsetTop,返回时再 window.scrollTo()。
-
location.hash改变会触发hashchange事件,但不会增加 history 条目 - 用
history.pushState()手动推入带 hash 的状态,才能让「返回」真正回到那个锚点位置 - 单页应用中,路由变化已自动管理 history,此时额外操作
hash很容易和框架冲突
实际项目里,history.back() 和带 returnUrl 的参数跳转覆盖了 95% 的需求。剩下那些非要靠 referrer 或锚点还原的场景,往往说明导航结构本身值得重新梳理。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











