Laravel维护模式通过生成storage/framework/down JSON文件实现全站503拦截,php artisan down可设--message、--retry、--allow参数,php artisan up删除该文件关闭;静态资源、Artisan命令等不受影响。

维护模式在 Laravel 中不是“页面开关”,而是通过中断请求生命周期实现的全站拦截,php artisan down 生成的是一个带时间戳和可选消息的 storage/framework/down 文件,Laravel 启动时会检查它并提前返回 503 响应。
如何开启维护模式(含自定义消息与重试时间)
默认执行 php artisan down 就会启用维护模式,但生产环境通常需要更精细控制:
-
--message:设置用户看到的提示文本,比如php artisan down --message="系统升级中,请稍候" -
--retry:指定 HTTP 响应头Retry-After的秒数,浏览器/爬虫可据此延迟重试,例如--retry=60表示 60 秒后重试 -
--allow:白名单 IP,允许特定地址绕过维护(调试用),支持单个 IP 或 CIDR,如--allow=192.168.1.100或--allow=10.0.0.0/8
命令执行后,Laravel 会在 storage/framework/down 写入 JSON 数据,包含 time、message、retry 和 allowed 字段 —— 这个文件是判断依据,不是 HTML 页面。
如何关闭维护模式
直接运行:
php artisan up
该命令会删除 storage/framework/down 文件。如果文件被手动修改或权限异常导致删除失败,artisan up 仍会报错,此时需手动清理:
- 确认
storage/framework目录可写 - 检查
storage/framework/down是否存在且非空 - 必要时用
rm storage/framework/down(Linux/macOS)或del storage\framework\down(Windows)手动清除
维护模式下哪些请求仍能访问?
Laravel 默认只拦截应用层请求,以下几类不受影响:
- 静态资源(
public/下的 CSS、JS、图片等),只要 Web 服务器(Nginx/Apache)配置正确,它们完全绕过 PHP - 未经过
public/index.php的请求,比如直接访问storage/app/xxx.jpg(若 Web 服务器未禁用) - Artisan 命令本身,如
php artisan tinker、php artisan migrate等仍可正常运行 - 如果你在中间件中手动跳过了
CheckForMaintenanceMode,那对应路由也会逃逸(不推荐)
注意:CheckForMaintenanceMode 中间件位于 app/Http/Kernel.php 的 $middleware 数组首位,不可移除或重排位置,否则维护模式失效。
常见问题与绕过陷阱
维护模式不是万能的,容易忽略的关键点:
- 缓存未清导致前端仍显示旧页面:执行
php artisan view:clear和php artisan config:clear,避免缓存的响应头或视图干扰 - CDN 或反向代理(如 Nginx)缓存了 503 响应:需主动刷新 CDN 缓存或临时禁用代理缓存逻辑
- 使用
php artisan down --render="errors::503"自定义模板时,必须确保该 Blade 模板存在且无语法错误,否则会抛出ViewNotFoundException - 多服务器部署时,
down文件只存在于当前执行命令的机器上 —— 若用负载均衡,需同步该文件或改用集中式维护开关(如 Redis 标志位)
真正起作用的只是那个 JSON 文件和框架启动时的一次性检查,别把它当成运行时状态管理工具。










