nginx可通过$time_local变量提取时分并用if判断非工作时间(如18:00–次日7:30),设$in_maintenance标志,再用return 302跳转至/maintenance.html;需单独配置location = /maintenance.html防止重定向循环,并确保文件存在且权限正确。

在 Nginx 中为 Java 应用(如 Tomcat、Spring Boot)配置“非工作时间自动显示维护公告”,核心不是改 Java 代码,而是让 Nginx 根据系统时间主动拦截请求,并跳转到静态维护页。这种方式零侵入后端,秒级生效,适合定时维护场景(例如每天 18:00–次日 7:30 不开放访问)。
用 $time_local 提取小时分钟做判断
Nginx 原生支持 $time_local 变量,格式为 01/Jan/2026:14:30:22 +0800。可借助正则提取当前时分,再用 if 判断是否处于非工作时段:
- 在
server或location /块内添加:
if ($time_local ~ "^(\d+)\/(\w+)\/(\d+):(\d{2}):(\d{2}):(\d{2}) \+(\d{4})$") {
set $hour $4;
set $minute $5;
}
set $in_maintenance off;
if ($hour if ($hour = "07" && $minute if ($hour > "18") { set $in_maintenance on; }
if ($hour = "18" && $minute >= "00") { set $in_maintenance on; }
注意:if 在 location 外不可用,务必把上述逻辑放在 location / 内;且避免嵌套多层 if,建议用上面这种扁平写法。
按状态跳转到维护页(推荐 return 302)
判断完成后,直接用 return 302 跳转,确保浏览器地址栏更新、搜索引擎识别为临时状态:
- 在同一个
location /块末尾加:
if ($in_maintenance = on) {
return 302 https://$host/maintenance.html;
}
确保 /maintenance.html 文件真实存在,路径在 Nginx 的 root 目录下(如 /usr/share/nginx/html/maintenance.html),且权限为 644、属主为 nginx 进程用户。
排除维护页自身被重定向(防循环)
如果不加限制,当用户访问 /maintenance.html 时也会触发判断,可能造成跳转循环。需单独定义该路径的 location:
- 在 server 块中添加:
location = /maintenance.html {
root /usr/share/nginx/html;
try_files $uri =404;
}
这个配置保证维护页能直接返回,不经过时间判断逻辑,彻底避免循环。
验证与注意事项
修改后必须执行 nginx -t 测试语法,再 nginx -s reload 生效。验证要点:
- 用
curl -I http://yourdomain.com查看响应头是否含Location:和302 - 手动改服务器时间(或等临近时段)测试跳转是否准时触发
- 检查维护页里的 CSS/JS 是否加载正常——建议用绝对路径或根路径引用资源(如
/css/style.css) - 避免在 if 中使用复杂逻辑或外部命令,Nginx 的 if 仅适合简单变量比较
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











