Nginx可通过内置时间变量判断非工作时段并返回503状态码及自定义维护页,无需修改PHP逻辑;配置包括设置小时/分钟变量、条件判断维护时段、return 503触发拦截,再通过error_page指向internal维护页。

要在 Nginx 中让 FastCGI(如 PHP)站点在非工作时间自动显示维护公告,核心思路是:**不修改后端逻辑,仅靠 Nginx 配置判断时间段,并主动返回 503 + 自定义维护页**。这和常规的错误页配置不同,关键在于“时间判断”与“动态拦截”,且需确保 FastCGI 请求被跳过、不转发给 PHP 处理。
1. 准备静态维护页面
把维护页(如 /usr/share/nginx/html/maintenance.html)放好,内容简洁明确,例如:
<h1>系统维护中</h1><p>服务时间:07:30–18:00(工作日)<br>当前不可访问,请稍后再试</p>确认文件权限为 644,属主为 Nginx 运行用户(如 nginx 或 www-data)。
2. 在 server 块中添加时间判断与拦截逻辑
利用 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";
<h1>非工作时间:早于 07:30 或晚于 18:00</h1><p>if ($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"; } }</p><h1>触发维护模式</h1><p>if ($in_maint = "1") {
return 503;
}注意:if 在 location 外使用是安全的;该段会覆盖所有请求(含 PHP),无需改动 FastCGI 的 location ~ \.php$ 块。
3. 配置 error_page 保持 503 并返回维护页
紧接在上面的 if 块之后,添加:
error_page 503 /maintenance.html;
location = /maintenance.html {
internal;
root /usr/share/nginx/html;
}这样当 return 503 执行时,Nginx 会内部重定向到该 HTML,状态码仍为 503,用户看不到真实路径,也不会被缓存或直接访问。
4. 验证与注意事项
- 执行
nginx -t检查语法,再nginx -s reload生效 - 用
curl -I http://your-site/查看响应头,确认返回HTTP/1.1 503 Service Temporarily Unavailable - 浏览器访问应显示 maintenance.html 内容,且 PHP 脚本(如
/info.php)不会被执行 - 该方案不影响其他非 PHP 请求(如图片、CSS),它们仍可正常提供
- 若需排除特定路径(如健康检查接口
/health),可在 if 前加条件:if ($request_uri != "/health") { ... }


















