Laravel 11 中域名白名单需通过 .env 定义字符串列表、config 解析为数组、中间件校验 Host 实现,且依赖 Web 服务器正确透传 Host 头。

在 Laravel 11 中,.env 文件本身不直接支持“域名白名单”这种运行时逻辑判断,它只负责加载静态环境变量。真正的域名白名单控制需要结合配置文件、中间件和环境变量三者协作完成。核心思路是:用 .env 定义当前环境及允许的域名列表 → 在配置中解析为数组 → 通过中间件校验请求 Host。
1. 在 .env 中定义环境与域名列表
不要在 .env 里写 PHP 数组语法,而是用字符串形式声明,例如:
APP_ENV=production DOMAIN_WHITELIST=prod.example.com,www.prod.example.com,admin.prod.example.com
开发和测试环境可分别设置:
# .env.local APP_ENV=local DOMAIN_WHITELIST=local.test,www.local.test <h1>.env.test</h1><p>APP_ENV=test DOMAIN_WHITELIST=test.example.com,api.test.example.com</p>
Laravel 11 默认只加载一个 .env(按 APP_ENV 值自动匹配 .env.{APP_ENV}),所以确保你已启用多环境加载机制(如通过 bootstrap/app.php 手动加载对应文件)。
2. 将域名列表转为配置数组
在 config/app.php 或新建 config/domain.php 中,解析环境变量:
// config/domain.php
return [
'whitelist' => explode(',', env('DOMAIN_WHITELIST', '')),
];
这样可通过 config('domain.whitelist') 在任意地方获取数组,且自动 trim 空格、兼容空值。
3. 创建域名校验中间件
运行命令生成中间件:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
php artisan make:middleware CheckDomainWhitelist
编辑 app/Http/Middleware/CheckDomainWhitelist.php:
public function handle(Request $request, Closure $next)
{
$host = $request->getHost();
$whitelist = config('domain.whitelist', []);
<pre class="brush:php;toolbar:false;">if (empty($whitelist) || ! in_array($host, $whitelist)) {
abort(403, 'Domain not allowed');
}
return $next($request);
}
在 app/Http/Kernel.php 的 $middlewareGroups['web'] 或全局 $middleware 中注册它(根据是否需覆盖所有请求决定位置)。
4. 配合 Web 服务器确保 Host 头准确传递
此中间件依赖 $request->getHost() 返回真实域名。务必确认 Nginx/Apache 正确透传 Host 头:
- Nginx:
server_name应包含通配符或显式域名,如server_name *.example.com example.com; - Apache:
ServerName和ServerAlias需覆盖所有白名单域名 - 本地开发(如 Valet/Homestead):确保
/etc/hosts条目与.env中域名完全一致(包括www、后缀等)
若用 php artisan serve,注意它不解析 Host 头,无法用于域名白名单测试——必须用 Nginx/Apache 或 Valet。










