nginx维护期间应使用return 302指令实现临时跳转,如return 302 https://maintain.example.com$request_uri;,确保保留原始路径参数、避免seo影响,并配合https全地址、维护页200响应及retry-after头提升体验。

系统维护期间用 Nginx 做临时引导,核心就是返回标准的 302 状态码,明确告诉浏览器和搜索引擎“这只是暂时的”,避免误判为永久搬家、影响 SEO 权重。
用 return 指令最简洁可靠
推荐直接使用 return 指令,语法清晰、执行高效,不会触发 rewrite 引擎的额外匹配逻辑。
- 在对应 server 块中写入:
return 302 https://maintain.example.com$request_uri; -
$request_uri会完整保留原始路径和查询参数(如/api/v1/user?id=123),用户跳转后仍能被维护页正确识别或记录 - 若只需跳首页,可简化为:
return 302 https://maintain.example.com/;
注意域名与协议一致性
目标地址尽量用 HTTPS 全地址,避免协议自动降级或跨域问题:
- 错例:
return 302 /maintenance.html;→ 这是内部重写,不是外部跳转,状态码也不对 - 错例:
return 302 //maintain.example.com$request_uri;→ 缺少协议,部分客户端可能解析失败 - 正确写法始终带
http://或https://
配合维护页做好用户体验
302 只负责跳转,真正的“系统正在维护”信息要靠目标页面承载:
- 维护页建议返回 HTTP 200,内容包含预计恢复时间、联系方式、进度提示等
- 可在响应头中加
Retry-After: 3600(单位秒),提示搜索引擎一小时后再来抓取原页面 - 避免把所有请求都无差别跳走——比如健康检查接口(
/healthz)应放行,方便监控系统判断服务状态
验证是否生效
配置完 reload Nginx 后,用 curl 快速确认:
-
curl -I http://your-site.com/→ 应看到HTTP/1.1 302 Found和Location: https://maintain.example.com/ - 浏览器访问时地址栏应跳转,且刷新后仍发起新请求(而非缓存跳转)
- 不要依赖浏览器地址栏是否变化来判断——重点看响应头里的状态码和 Location 字段











