nginx维护模式应使用return 302实现临时跳转,避免seo影响和缓存;需配置/maintenance.html直访权限、支持条件跳转(如ip或路径排除)、https多域名统一处理,并通过maintenance.on文件开关控制,配合静态页内容部署。

系统升级维护时,用 Nginx 做 302 重定向,核心目标是:临时把所有流量导到维护页,不干扰 SEO,也不让浏览器或搜索引擎缓存跳转。302 正是为此设计的——它明确告诉访问者和爬虫:“这只是暂时的,原地址依然有效”。
维护期间全局 302 跳转到静态维护页
适用于整个站点停服、只展示一个提示页面(如 /maintenance.html)的场景。
使用
return 302指令最简洁、性能最好,且天然支持临时性-
配置示例:
server { listen 80; server_name example.com; # 所有请求都临时跳转到维护页 location / { return 302 /maintenance.html; } # 维护页本身需能被直接访问(不被上面的 location 拦截) location = /maintenance.html { root /usr/share/nginx/html; internal; # 可选:限制仅服务器内部访问,防止外部直链 } }⚠️ 注意:
return 302 /maintenance.html是内部重定向(地址栏不变),若希望浏览器地址栏显示/maintenance.html,应写成return 302 https://example.com/maintenance.html;(完整 URL)
按条件启用维护跳转(更灵活)
比如只对非管理员 IP 或非特定路径开启跳转,方便运维人员绕过:
# 允许本地或运维 IP 直接访问,其他人跳转
if ($remote_addr != "192.168.1.100" && $remote_addr != "2001:db8::1") {
return 302 /maintenance.html;
}
或排除特定路径(如健康检查接口):
location / {
if ($request_uri !~ ^/(health|api/health|maintenance\.html)$) {
return 302 /maintenance.html;
}
}
配合 HTTPS 和多域名统一跳转
如果主站支持 HTTPS 和多个域名(如 www 和裸域),建议在所有入口 server 块中统一处理:
server {
listen 80;
server_name example.com www.example.com;
return 302 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate ...;
ssl_certificate_key ...;
# 维护模式开关:用一个文件标记状态(便于一键启停)
if (-f /etc/nginx/maintenance.on) {
return 302 /maintenance.html;
}
# 正常业务配置...
location / {
proxy_pass http://backend;
}
}
这样只需 touch /etc/nginx/maintenance.on 启用,rm /etc/nginx/maintenance.on + nginx -s reload 即可恢复。
别忘了静态维护页内容
确保 /maintenance.html 文件存在且可读:
echo '<h1>系统正在升级维护中,预计30分钟内恢复</h1>' \ > /usr/share/nginx/html/maintenance.html
同时建议加简单样式或倒计时脚本,提升用户体验。
不复杂但容易忽略











