Laravel 12 配置 HTTPS 环境 CORS 必须信任代理并正确识别协议:需配置 TrustProxies 中间件、Nginx 传递 X-Forwarded-Proto,allowed_origins 严格匹配前端 HTTPS 协议,supports_credentials=true 时禁止使用 *,且前端 fetch 需设 credentials: 'include'。

在 Laravel 12 中配置 CORS 时若后端已启用 HTTPS(如部署在 Nginx/Apache 的 443 端口,或经 Cloudflare、负载均衡器代理),仅设置 allowed_origins 为 https://your-frontend.com 是不够的——必须确保 Laravel 能正确识别请求协议为 HTTPS,否则中间件生成的响应头、预检处理逻辑甚至 Cookie 安全策略都可能失效。
确保 Laravel 信任代理并识别 HTTPS 协议
大多数生产环境(Nginx、Cloudflare、AWS ALB)中,HTTPS 终止在反向代理层,Laravel 实际收到的是 HTTP 请求。若不显式告知 Laravel “上游已用 HTTPS”,$request->secure() 始终返回 false,进而影响:
- CORS 中间件对
supports_credentials = true场景的校验逻辑 - Session Cookie 的
Secure标志是否生效 -
url()、route()生成的链接是否带https://
需确认 app/Http/Middleware/TrustProxies.php 配置正确:
-
protected $proxies = '**';(开发/测试可设为'127.0.0.1,172.*'等具体网段) -
protected $headers = Request::HEADER_X_FORWARDED_ALL;(确保读取X-Forwarded-Proto) - Nginx 配置中必须包含:
proxy_set_header X-Forwarded-Proto $scheme;;若用 Cloudflare,建议强制设为https
cors.php 中 origin 必须与前端实际协议严格匹配
前端资源若通过 HTTPS 加载(如 https://app.example.com),则 config/cors.php 的 allowed_origins 必须写完整协议 + 域名,不能省略 https:// 或混用 http://:
- ✅ 正确:
['https://app.example.com', 'https://admin.example.com'] - ❌ 错误:
['app.example.com'](缺少协议,会被拒绝) - ❌ 危险:
['*'](即使 HTTPS 环境下也禁止用于supports_credentials = true)
若前端同时支持 HTTP 和 HTTPS(如本地开发 vs 生产),建议按环境变量动态配置:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
'allowed_origins' => explode(',', env('CORS_ORIGINS', 'https://app.example.com'))
并在 .env 中定义:CORS_ORIGINS=https://app.example.com,https://staging.example.com
HTTPS 下启用 credentials 需同步调整前端和响应头
当需要跨域携带 Cookie 或认证凭证(如 Sanctum 的会话)时:
- Laravel 配置中
supports_credentials必须设为true -
allowed_origins不能为*,且必须与前端当前协议一致(如https://) - 前端 fetch 请求需显式开启:
credentials: 'include' - 确保
SESSION_SECURE_COOKIE=true且APP_URL以https://开头
否则浏览器将静默丢弃 Cookie,或报错 Failed to load http://...: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'。
验证与调试要点
遇到 HTTPS 下 CORS 失败,优先检查:
- 浏览器开发者工具 Network → 选中请求 → 查看
Request Headers中Origin是否为https://... - 查看响应头中是否含
Access-Control-Allow-Origin: https://...(不是*)及Access-Control-Allow-Credentials: true - 检查预检(OPTIONS)请求是否返回 200,且响应头包含
Access-Control-Allow-Methods等 - 运行
php artisan tinker执行request()->secure(),确认返回true










