最直接可靠的全站维护跳转方案是使用 return 302 指令,配合 /maintenance.html 页面及 internal 保护,支持精准路径匹配、ip 白名单放行和动态 flag 开关,兼顾 seo、缓存与运维灵活性。

用 return 302 指令配最直接、最可靠,既能明确传达“临时性”,又不干扰 SEO,也不被浏览器或 CDN 长期缓存。
全站跳转到维护公告页(推荐基础写法)
适合维护期间所有请求都导向一个静态 HTML 页面:
- 在 server 块里加一行
return 302 /maintenance.html; - 确保
/maintenance.html文件真实存在,且放在 Nginx 的root目录下(如/usr/share/nginx/html/maintenance.html) - 不要漏掉
internal;保护这页不被用户直接访问:location = /maintenance.html { root /usr/share/nginx/html; internal; }
只对部分路径跳转(精准控制)
比如只把 /admin、/api、/dashboard 这类核心入口临时切走,其他页面照常访问:
- 用正则匹配路径前缀:
location ~ ^/(admin|api|dashboard) { return 302 /maintenance.html; } - 这样不影响首页、静态资源(JS/CSS/图片)等正常加载,用户体验更平滑
按 IP 白名单放行,其他人跳转(运维友好)
开发或运维人员可继续访问,普通用户看到公告页:
- 直接在 location 中判断
$remote_addr:location / { if ($remote_addr != "192.168.1.100") { return 302 /maintenance.html; } } - 更稳妥的做法是用
map提前定义变量,避免if在 location 外滥用
动态开关维护模式(免改配置)
不用每次维护都改 Nginx 配置、重载服务:
- 在 server 块中加判断:
if (-f /var/www/maintenance.flag) { return 302 /maintenance.html; } - 维护时创建空文件:
touch /var/www/maintenance.flag - 恢复时删掉它,再
nginx -s reload即可
验证时用 curl -I http://your-domain.com/any-path,确认响应头含 HTTP/1.1 302 Found 和 Location: /maintenance.html,且没有循环跳转。
维护页本身必须能独立加载(CSS/JS 路径别写错),否则公告也显示不全。











