Laravel Blade中url()函数未获取APP_URL的HTTPS协议问题排查
问题描述
在Docker容器中运行的Laravel项目里,Blade文件执行以下代码:
{{ url('xero_invoice_authorised') }}</br> config app url - {{ config('app.url') }}</br> env app url - {{ env('APP_URL') }}
输出结果:
http://xxxx/xero_invoice_authorised config app url - https://xxxx/ env app url - https://xxxx/
url()函数返回HTTP协议的URL,但config('app.url')和env('APP_URL')均配置为HTTPS。已执行清除缓存、视图、路由及optimize命令,问题仍未解决,需要让{{ url('') }}返回.env文件中的APP_URL值。
解决方法
配置信任代理
Laravel在Docker环境中可能无法识别反向代理传递的HTTPS协议,需修改App\Http\Middleware\TrustProxies.php:class TrustProxies extends Middleware { protected $proxies = '*'; // 生产环境建议指定具体代理IP,如['192.168.1.0/24'] protected $headers = Request::HEADER_X_FORWARDED_ALL; }这会让Laravel信任代理传递的
X-Forwarded-Proto头,从而正确识别HTTPS协议。强制URL使用HTTPS
在app/Providers/AppServiceProvider.php的boot方法中添加代码,强制生成HTTPS链接:use Illuminate\Support\Facades\URL; public function boot() { // 仅生产环境强制HTTPS if (config('app.env') === 'production') { URL::forceScheme('https'); } // 或全局强制(包括开发环境) // URL::forceScheme('https'); }检查Docker容器环境变量
进入Docker容器,执行echo $APP_URL确认环境变量是否正确加载,避免容器启动时.env配置被覆盖:docker exec -it [容器ID/名称] bash echo $APP_URL验证反向代理配置
若使用Nginx作为反向代理,确保配置中传递了正确的请求头:location / { proxy_pass http://laravel-app; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; }这会将客户端的真实协议传递给Laravel应用。
内容的提问来源于stack exchange,提问作者Yasitha
相关产品推荐
相关产品推荐

