Laravel中request()->fullUrlWithQuery返回http而非https问题
问题分析与解决
出现这个问题的核心原因是 request()->fullUrlWithQuery() 方法基于当前请求实例的协议(scheme)生成 URL,而 URL::forceScheme('https') 仅全局设置了 Laravel URL 生成器的默认协议,二者作用对象不同。
具体场景及解决办法:
反向代理未配置信任代理
如果应用部署在 Nginx、Apache 这类反向代理之后,Laravel 默认无法识别真实的请求协议(HTTPS),导致请求实例的协议仍为 HTTP。此时即使设置了URL::forceScheme('https'),request()相关方法仍会生成 HTTP 地址,而url()辅助函数则会遵循全局设置返回 HTTPS。解决:在
AppServiceProvider的boot方法中添加信任代理配置:use Illuminate\Http\Request; use Illuminate\Support\Facades\URL; public function boot() { if (App::environment('production')) { URL::forceScheme('https'); // 信任所有代理服务器,也可替换为你的代理IP列表 Request::setTrustedProxies(['*'], Request::HEADER_X_FORWARDED_ALL); } }同时确保反向代理服务器已传递
X-Forwarded-Proto头(比如 Nginx 配置中添加proxy_set_header X-Forwarded-Proto $scheme;)。视图缓存残留旧内容
如果之前视图缓存过 HTTP 版本的 URL,即使代码修复后,缓存的视图仍会返回旧的 HTTP 地址。解决:清除视图缓存:
php artisan view:clear改用 URL 生成器方法替代请求实例方法
直接使用 Laravel URL 生成器的fullUrlWithQuery方法,它会严格遵循URL::forceScheme的全局设置:<button class='ml-3 btn btn-success' onclick="exportSheet(this, '{{ url()->fullUrlWithQuery([ 'export' => 1 ]) }}')" > Export </button>
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

