Nginx可通过内置时间变量判断非工作时段并返回503状态码及自定义维护页,无需修改PHP逻辑;配置包括设置小时/分钟变量、条件判断维护时段、return 503触发拦截,再通过error_page指向internal维护页。
要在 Nginx 中让 FastCGI(如 PHP)站点在非工作时间自动显示维护公告,核心思路是:不修改后端逻辑,仅靠 Nginx 配置判断时间段,并主动返回 503 + 自定义维护页。这和常规的错误页配置不同,关键在于“时间判断”与“动态拦截”,且需确保 FastCGI 请求被跳过、不转发给 PHP 处理。
把维护页(如 /usr/share/nginx/html/maintenance.html)放好,内容简洁明确,例如:
<h1>系统维护中</h1><p>服务时间:07:30–18:00(工作日)<br>当前不可访问,请稍后再试</p>确认文件权限为 644,属主为 Nginx 运行用户(如 nginx 或 www-data)。
利用 Nginx 内置变量 $time_local 提取小时和分钟,用正则匹配并设置开关变量:
在 server{...} 内顶部(务必放在 location ~ .php$ 之前)加入:
if ($time_local ~ "^(d+)/(w+)/(d+):(d{2}):(d{2}):") {set $hour $4;set $minute $5;}set $in_maint "0";非工作时间:早于 07:30 或晚于 18:00if ($hour < "07") { set $in_maint "1"; } if ($hour = "07") { if ($minute < "30") { set $in_maint "1"; } } if ($hour > "18") { set $in_maint "1"; } if ($hour = "18") { if ($minute > "00") { set $in_maint "1"; } }
触发维护模式if ($in_maint = "1") { return 503; }
注意:if 在 location 外使用是安全的;该段会覆盖所有请求(含 PHP),无需改动 FastCGI 的 location ~ .php$ 块。
紧接在上面的 if 块之后,添加:
error_page 503 /maintenance.html;location = /maintenance.html {internal;root /usr/share/nginx/html;}
这样当 return 503 执行时,Nginx 会内部重定向到该 HTML,状态码仍为 503,用户看不到真实路径,也不会被缓存或直接访问。
nginx -t 检查语法,再 nginx -s reload 生效curl -I http://your-site/ 查看响应头,确认返回 HTTP/1.1 503 Service Temporarily Unavailable
/info.php)不会被执行/health),可在 if 前加条件: if ($request_uri != "/health") { ... }