You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel在EC2负载均衡下因HTTP/HTTPS不一致导致签名验证失败

解决Laravel负载均衡下HTTPS/HTTP不一致导致邮箱验证签名失败的问题

问题核心是负载均衡转发请求时,Laravel无法识别真实的用户请求协议(HTTPS),导致生成验证链接用HTTPS,但验证请求被识别为HTTP,签名校验不通过。以下是具体解决步骤:

1. 配置信任代理

修改app/Http/Middleware/TrustProxies.php,让Laravel信任负载均衡的代理请求,并正确解析转发头:

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    // 生产环境建议替换为负载均衡的具体IP/IP段,比如AWS ELB的IP范围
    protected $proxies = '*';

    protected $headers = Request::HEADER_X_FORWARDED_FOR | 
                         Request::HEADER_X_FORWARDED_HOST | 
                         Request::HEADER_X_FORWARDED_PORT | 
                         Request::HEADER_X_FORWARDED_PROTO;
}

2. 修正环境变量配置

  • 在.env文件中设置正确的HTTPS地址:APP_URL=https://your-domain.com
  • 可选:添加FORCE_HTTPS=true,强制Laravel生成HTTPS协议的链接

3. 确保负载均衡转发正确的头部

以AWS ELB为例,检查监听器配置:确保转发头包含X-Forwarded-Proto,这个头部会告诉Laravel用户实际使用的是HTTP还是HTTPS协议。如果是应用负载均衡(ALB),默认会转发这个头部,但若有自定义配置需确认。

4. 清除缓存使配置生效

执行以下命令清除Laravel缓存,避免旧配置残留:

php artisan config:clear
php artisan route:clear
php artisan cache:clear

原理说明

负载均衡通常会把HTTPS请求转换成HTTP转发到EC2实例,Laravel默认只会识别实例收到的HTTP协议,导致生成验证链接时用的是HTTPS(来自APP_URL),但验证时Laravel认为请求是HTTP,签名生成的URL和请求URL不一致,最终校验失败。通过信任代理并解析X-Forwarded-Proto头,Laravel就能获取到用户真实的请求协议,保证生成和验证时的URL协议一致。

内容的提问来源于stack exchange,提问作者ChaseMedallion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:57:47