meta refresh 是最常用且兼容性最好的跳转方案,无需 JavaScript,支持所有浏览器,适用于静态页、404 页及 SEO 敏感场景;content 必须为“秒数;url=地址”格式,严禁空格与拼写错误。

meta http-equiv="refresh" 是最常用且兼容性最好的方案
不需要 JavaScript,所有浏览器都支持,适合静态页、404 页或 SEO 敏感场景。关键在 content 的格式:必须是「秒数;url=地址」,中间用分号隔开,不能有空格,url= 前缀不能漏。
-
<meta http-equiv="refresh" content="3;url=https://new-site.com">—— 3 秒后跳转 -
<meta http-equiv="refresh" content="0;url=/login">—— 立即跳转(常用于登录页重定向) -
<meta http-equiv="refresh" content="5.5;url=https://example.com/path?ref=timer">—— 支持小数秒和带参数的 URL
常见错误:content="3 ; url=https://..."(空格导致失效)、content="3;rul=https://..."(拼错 url)、content="3;https://..."(漏掉 url=)。
setTimeout + window.location.href 更适合需要逻辑控制的场景
当你要判断用户是否已登录、是否来自特定渠道、或跳转前需关闭弹窗/上报埋点时,JS 方案不可替代。它不依赖 <head> 位置,但要注意执行时机和清理问题。
- 脚本放在
<head>里建议加defer,避免因 DOM 未就绪引发意外错误(虽然跳转本身仍会生效) - 用户刷新或前进/后退时,
setTimeout不会自动取消 —— 若页面有交互状态,务必配合clearTimeout和beforeunload或路由变化监听 - 想新开标签页?用
window.open('https://...', '_blank'),但非用户主动触发会被多数浏览器拦截
示例:setTimeout(() => { window.location.href = '/dashboard'; }, 2000);
立即学习“前端免费学习笔记(深入)”;
按具体时间点跳转(比如每天 22:00)必须用 JS 计算毫秒差
meta refresh 只支持固定延迟,无法实现“今天 22:00 跳转”。得靠 JS 获取当前时间,算出距目标时间的毫秒数,再传给 setTimeout。
- 注意时区:
new Date()默认用本地时区,若需统一按 UTC 或服务端时间,得额外处理 - 目标时间跨天时,要判断是否已过期(比如现在是 22:05,当天目标已错过,就得设为明天 22:00)
- 页面长期挂起(如标签页休眠)可能导致定时不准,浏览器可能节流后台定时器
核心逻辑:const target = new Date('2026-08-04T22:00:00'); const delay = target.getTime() - Date.now(); if (delay > 0) setTimeout(() => { window.location.href = '/sale'; }, delay);
多域名条件跳转需用 location.hostname 判断来源
一个 HTML 文件部署在多个域名下,想根据访问域名不同跳转到对应后台,不能靠 meta refresh 实现,必须用 JS 动态判断。
- 用
window.location.hostname获取当前域名(不含协议和路径),比location.href更安全稳定 - 避免用
==直接比较,推荐includes()或正则匹配,兼容 www/non-www、子域名等变体 - 加上
try/catch防止 iframe 嵌套时top.location权限报错
示例:if (location.hostname.includes('old-site')) { top.location.href = 'https://new-site.com'; }
实际使用中,最容易被忽略的是跳转时机与用户行为的冲突——比如用户刚输入表单就触发跳转,或页面正在播放视频时突然离开。这类问题没法靠单一代码解决,得结合业务逻辑加 guard 条件,而不是只写个 setTimeout 就完事。



















