Nginx通过return 503拦截所有请求并配合error_page指向维护页,再于@maintenance块中用try_files加载maintenance.html,同时显式添加Cache-Control "no-store, no-cache, must-revalidate, max-age=0"等头强制禁用缓存。

要让 Nginx 在维护期间对所有用户请求统一返回无缓存的页面(比如维护页 maintenance.html),同时确保浏览器不缓存该页面本身,关键在于两层控制:一是让 Nginx 主动返回维护页并覆盖原有逻辑;二是强制该响应头禁止任何缓存。这不是单纯“关闭缓存”,而是“精准接管 + 强制不缓存”。
用 return 指令全局拦截并返回维护页
在 server 或 http 块顶部添加拦截规则,优先级高于其他 location:
- 使用
return 503返回标准维护状态码,比 200 更符合语义 - 指定本地维护页路径,Nginx 直接读取并响应,不经过 proxy_pass 或 root 查找
- 配合
error_page 503可进一步定制响应体(可选)
示例配置:
server {
# 维护模式开关:启用时所有请求走这里
if (-f /usr/share/nginx/html/maintenance.enable) {
return 503;
}
<pre class='brush:php;toolbar:false;'>error_page 503 @maintenance;
location @maintenance {
root /usr/share/nginx/html;
try_files /maintenance.html =503;
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
add_header Pragma "no-cache";
add_header Expires "0";
}
# 其他正常 location …}
确保维护页响应头真正生效
仅靠 add_header 不够——如果维护页是通过 try_files 或 alias 返回的静态文件,Nginx 默认会按 MIME 类型附加默认过期头(如 expires 1h)。必须显式覆盖:
- 在维护页对应的
location或@named块中设置全部三个关键头 -
Cache-Control用no-store最严格(禁止存储+渲染),比no-cache更可靠 - 避免在
http块全局加add_header,否则可能被后续 location 覆盖或重复
维护开关与快速启停
用文件存在性判断比改配置更安全、无需重载:
- 上线维护:
touch /usr/share/nginx/html/maintenance.enable - 恢复服务:
rm /usr/share/nginx/html/maintenance.enable - 可配合 systemd timer 或 CI/CD 脚本自动执行
- 注意该文件权限需为 nginx worker 进程可读(如
chmod 644)
验证是否真正无缓存
部署后务必检查响应头和行为:
- 浏览器访问,F12 → Network → 查看响应头是否有
Cache-Control: no-store... - 刷新页面,观察 Network 中状态是否为
200(非304或from disk cache) - 用
curl -I http://your-domain/确认头信息输出正确 - 特别注意:某些 CDN 会忽略 origin 的缓存头,需额外配置 CDN 层 bypass


















