
Laravel 执行 php artisan config:cache 后,env() 调用在运行时被忽略,导致 Nginx 通过 fastcgi_param WEBSITE 传递的变量无法在缓存配置中生效;解决方案是将该变量显式写入生产环境的 .env 文件并重新缓存配置。
laravel 执行 `php artisan config:cache` 后,`env()` 调用在运行时被忽略,导致 nginx 通过 `fastcgi_param website` 传递的变量无法在缓存配置中生效;解决方案是将该变量显式写入生产环境的 `.env` 文件并重新缓存配置。
在 Laravel 中,config:cache 命令会将所有配置文件(包括 config/view.php)中调用 env() 的结果静态化为实际值,并写入 bootstrap/cache/config.php。这意味着:一旦缓存生成,后续请求将完全绕过 .env 文件和 $_SERVER/getenv() 等运行时环境读取逻辑——Nginx 通过 fastcgi_param WEBSITE example.com; 传递的变量虽可在 phpinfo() 或 $_SERVER['WEBSITE'] 中看到,但在已缓存的配置中早已“固化”为 null 或默认值,从而引发 resource_path('views/' . env('WEBSITE')) 路径错误。
✅ 正确解法不是禁用配置缓存(牺牲性能),也不是硬编码视图路径或修改所有 Blade 模板,而是确保 WEBSITE 在 config:cache 构建阶段即可被解析:
-
在生产环境的
.env文件中显式声明该变量:WEBSITE=site-a.example.com # 或根据站点分别部署不同 .env(如 site-b.example.com)
-
重新生成缓存:
php artisan config:clear php artisan config:cache
此时 config/view.php 中的 env('WEBSITE') 将被 .env 中的值替换,'paths' => [resource_path('views/site-a.example.com')] 将被正确缓存并生效。
⚠️ 注意事项:
- 不要依赖
$_SERVER['WEBSITE']或getenv('WEBSITE')在配置文件中动态读取——config:cache仅解析env(),且只从.env加载; - 若需多站点共用同一份部署包(如通过 Nginx 分发不同
WEBSITE),则必须为每个站点维护独立的.env文件(可通过部署脚本注入),不能依赖运行时 Nginx 变量驱动配置缓存; - 验证方式:检查
bootstrap/cache/config.php中view.paths是否已展开为具体路径,而非含env('WEBSITE')的表达式。
此方案兼顾性能与灵活性,是 Laravel 官方推荐的环境变量使用范式:.env 用于构建时配置,运行时变量(如 Nginx fastcgi_param)应仅用于中间件、控制器等非配置层逻辑。











