php artisan down --secret 用于启用维护模式并生成绕过凭证,仅允许携带匹配 ?secret=xxx 参数的请求访问,其他所有请求返回503;该机制基于URL参数校验,不涉及IP、User-Agent等网络信息判断。

什么是 php artisan down --secret 的作用
php artisan down --secret 并不是用来“对特定 IP 开放访问”的功能,它生成的是一个绕过维护模式的临时访问凭证(即 secret token),本质是 URL 后缀校验机制。Laravel 不会根据 IP 白名单做判断,而是检查请求中是否携带了匹配的 secret 参数。
如何用 --secret 实现“仅限自己访问”
虽然不基于 IP,但你可以把 secret 当作私密入口钥匙,只在自己的浏览器或调试工具中使用。关键在于:这个 secret 仅在当前维护模式下有效,且每次执行 php artisan down --secret=xxx 都会覆盖旧值。
-
php artisan down --secret="mydevkey"启用维护模式,并允许通过/?secret=mydevkey访问 - 访问地址变成类似
https://yoursite.com/?secret=mydevkey - 所有其他未带该参数的请求,包括你本机其他标签页、Postman、curl,默认返回 503
- 该 secret 不校验来源 IP、User-Agent 或 Referer,纯靠保密性 —— 所以别写死在代码里或提交到 Git
为什么不能直接靠 --secret 做 IP 限制
Laravel 内置的维护模式中间件 \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode 只做两件事:检查 storage/framework/down 文件是否存在,以及比对 request()->input('secret') 是否匹配文件内容。它完全不读取 $_SERVER['REMOTE_ADDR'] 或任何网络层信息。
如果你真需要 IP 白名单,必须手动扩展:
php artisan down
# 然后在 app/Http/Middleware/CheckForMaintenanceMode.php 中重写 handle() 方法(或新建中间件替换):
public function handle($request, Closure $next)
{
if (file_exists($this->downFile)) {
$data = json_decode(file_get_contents($this->downFile), true);
$allowedIps = $data['allowed_ips'] ?? ['127.0.0.1', '::1'];
if (! in_array($request-youjiankuohaophpcnip(), $allowedIps) &&
$request-youjiankuohaophpcninput('secret') !== ($data['secret'] ?? null)) {
throw new MaintenanceModeException();
}
}
return $next($request);}
注意:这要求你自定义维护文件格式(比如写 JSON 而非纯文本),并修改 php artisan down 命令行为(需重写 Artisan 命令或改用 shell 脚本写入)。
容易被忽略的关键点
维护模式的 secret 是明文写在 storage/framework/down 文件里的,只要能读取该文件(比如通过目录遍历、日志泄露、部署脚本误输出),别人就能绕过。生产环境务必确保 storage/ 不可 Web 访问,且不要在错误页面或日志中打印该文件内容。










