真正实现“一键启用维护公告”的核心是try_files配合index指令——前者主动拦截所有请求并返回/maintenance.html或503状态码,后者仅对目录请求自动兜底查找maintenance.html;配合ip白名单、自包含html及curl测试可完成免重启维护切换。

直接用 index 指令本身无法触发维护页,它只在访问目录(如 / 或 /blog/)时自动找默认文件。真正实现“一键启用维护公告”的核心是 try_files 配合 index 的辅助作用——前者负责主动拦截所有请求,后者确保兜底路径能正确加载 HTML 文件。
用 try_files 强制返回维护页(最常用)
把维护页设为 try_files 的第一项,存在即返回,状态码可设为 503 表示服务不可用:
location / {root /usr/share/nginx/html;try_files /maintenance.html =503;}
关键点:
– /maintenance.html 是绝对路径,会拼接 root 路径,实际查找 /usr/share/nginx/html/maintenance.html
– 文件存在就返回,不存在则直接返回 503 状态码(浏览器显示空白或默认错误页)
– 不影响静态资源:可单独为 .js/.css 等加 location 块,避免维护页里的样式丢失
配合 index 实现目录级自动兜底
当用户访问的是一个目录(比如直接打开 https://example.com/),index 指令可让 Nginx 自动尝试找 maintenance.html:
index maintenance.html index.html;
这样配置后:
– 请求 / 时,Nginx 先查 /maintenance.html,存在就返回
– 若维护页不存在,再找 /index.html,恢复正常首页
– 注意:这仅对目录请求生效,对 /about、/api/login 这类非目录路径无效,仍需靠 try_files 或 error_page 控制
按条件启用(如白名单绕过)
运维人员或内网 IP 可跳过维护页,普通用户看到公告:
- 用
map或if判断客户端 IP,设置开关变量 - 再结合
try_files或return控制流向
示例片段:
set $maint_mode off;if ($remote_addr != "192.168.1.100") { set $maint_mode on; }if (-f $document_root/maintenance.html) { set $maint_mode "${maint_mode}on"; }if ($maint_mode = "onon") { return 503; }
该方式无需重启 Nginx,只需创建/删除 maintenance.html 文件即可切换状态
维护页内容要自包含
避免依赖外部资源导致页面空白:
- CSS 写在
<style></style>标签内,不引用外链 - 图片用 base64 编码或内联 data URL
- 去掉所有 JS 请求(包括统计、埋点、CDN 脚本)
- 加上
<meta name="viewport">保证移动端适配 - 标题写清原因和预计恢复时间,例如:
<title>系统升级中|预计7月21日10:00恢复</title>
测试时用 curl 或浏览器 Network 面板确认:任意路径(如 /nonexistent、/api/status)响应体都是维护页 HTML,且状态码为 503











