当 supports_credentials 设为 true 时,allowed_origins 绝对不能是 ['*'],必须明确列出具体域名,否则浏览器静默拦截且不发送预检请求;前端需同步配置 credentials: 'include',Nginx 必须正确透传 OPTIONS 请求并避免响应头冲突。

当 supports_credentials 设为 true 时,Laravel 的 CORS 配置会触发浏览器最严格的跨域校验规则,稍有不慎就会静默失败——连预检请求都看不到。这不是配置写错了,而是违反了浏览器强制规范。
allowed_origins 绝对不能是 ['*']
这是最常踩的坑。只要 supports_credentials => true,allowed_origins 必须明确列出每个合法前端域名,例如:
-
['http://localhost:3000'](开发环境) -
['https://app.example.com', 'https://admin.example.com'](生产环境)
写成 ['*'] 会导致浏览器直接报错:A wildcard '*' cannot be used,且不发实际请求,控制台可能只显示“CORS policy blocked”,毫无预检日志。
前端必须同步启用 credentials
后端开了 supports_credentials,前端却没配 credentials: 'include',照样失败。常见场景:
- Fetch 请求要加
{ credentials: 'include' } - Axios 要设
withCredentials: true - jQuery.ajax 要设
xhrFields: { withCredentials: true }
两者必须严格匹配,缺一不可。
Nginx 必须透传 OPTIONS 请求
如果 Nginx 拦截或直接返回 204/405 而不转发给 PHP-FPM,Laravel 根本收不到预检请求,HandleCors 中间件完全不执行。检查 Nginx 配置中是否有:
- 未注释或误删
location / { try_files $uri $uri/ /index.php?$query_string; }类规则 - 错误添加了
add_header Access-Control-Allow-Origin '*';—— 这会和 Laravel 的响应头冲突,覆盖掉动态生成的正确头 - 缺少对
OPTIONS方法的显式放行(尤其在if ($request_method = 'OPTIONS') { ... }块里没做add_header或return 204)
Session 和 Cookie 域名需对齐
若用 Sanctum 或 Session 认证,还需确保:
-
SESSION_DOMAIN在.env中设为.example.com(带前导点),否则 Cookie 不随跨域请求发送 - 前端域名与后端 Cookie 域名能匹配(如
app.example.com和api.example.com共享.example.com) - HTTPS 环境下,
SESSION_SECURE和SESSION_HTTP_ONLY应为true,且前端协议必须是https











