Laravel部署在应用网关后如何正确配置SSL URL?
解决Laravel 9部署在Azure App Gateway/WAF后的URL及POST 404问题
最优解决思路:配置Laravel信任代理,自动识别真实请求协议
硬编码forceScheme('https')的方式过于粗暴,会忽略网关传递的真实请求头信息,进而导致路由匹配异常出现404。正确的做法是让Laravel信任Azure App Gateway的代理,自动读取网关转发的请求头来识别协议和来源。
步骤1:修改信任代理中间件
打开app/Http/Middleware/TrustProxies.php文件,更新以下内容:
- 将
$proxies设置为Azure App Gateway的IP段(可从Azure官方文档获取精准CIDR范围,生产环境推荐配置具体IP;测试环境可临时用'*'信任所有代理) - 将
$headers设置为Request::HEADER_X_FORWARDED_ALL,确保Laravel读取所有转发头信息
修改后的示例代码:
<?php namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware { /** * The trusted proxies for this application. * * @var array<int, string>|string|null */ protected $proxies = [ // 替换为Azure App Gateway的IP或CIDR,例如: // '13.107.6.152/31', // '13.107.18.10/31', // 测试环境可临时用 '*' ]; /** * The headers that should be used to detect proxies. * * @var int */ protected $headers = Request::HEADER_X_FORWARDED_ALL; }
步骤2:移除硬编码的forceScheme代码
删除RouteServiceProvider中添加的resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');代码。
步骤3:验证效果
完成配置后,Laravel会自动通过网关传递的X-Forwarded-Proto头识别真实请求协议(https),此时:
url()助手会自动生成https链接,无需全局替换为secure_url()- POST请求到
https://..../signin时,Laravel能正确识别请求协议,匹配对应路由,解决404问题
额外排查方向
如果仍存在问题,可检查:
- Azure App Gateway是否已配置传递
X-Forwarded-Proto、X-Forwarded-For等请求头 - Laravel路由是否存在scheme约束(例如
Route::post('/signin')->scheme('https')),确保路由未强制要求特定协议
内容的提问来源于stack exchange,提问作者Ed Greenberg
相关产品推荐
相关产品推荐

