问题复现
不二在写代码时喜欢使用 asset
函数,用这个函数有个好处是,可以根据输入的字符自动检索静态文件,而不必全部手动输入。
这种方式在 Nginx + php-fpm 的模式下,尚未出现问题,但是在 Laravel Octane 即 Nginx + Swoole 下就遇到了静态资源无法加载的问题。
从报错信息可以看出,通过 https 方式访问了网站,但是静态资源还是通过 http 加载的,属于混入内容,浏览器认为是不安全的,这种方式从 Chrome 84 就已经被禁止了。
解决方案
从函数入手
给 asset
函数传入第二个参数 true
,或者将 asset
函数更换为 secure_asset
函数。这种方式虽然可以解决问题,但不是最优的方案。
弊端:
- 多处使用就要多处替换,容易遗漏,虽然可以全局替换,总归是有点麻烦。
- 一般开发环境都是 http 使用
secure_asset
会导致开发环境无法加载静态资源。
全局转换
在 App\Providers\AppServiceProvider
的 boot
方法中添加以下代码,通过判断当前环境,如果是正式环境则全局使用 https。
if (app()->environment('production')) {
URL::forceScheme('https');
}
修改配置
将 config/octane.php
配置文件中 OCTANE_HTTPS
设置为 true
,在 .env
中添加以下代码,这是最优方案!
OCTANE_HTTPS=true
注意:一定要重启 Octane 服务!
php artisan octane:reload