需带凭证时allowed_origins必须明确列出完整可信域名(如['https://myapp.com', 'http://localhost:3000']),禁用'',并设supports_credentials=true;前端fetch需配credentials:'include';纯公开接口才可设['']且supports_credentials=false。

allowed_origins 的设置不能只看“想不想放行”,关键得看前端要不要传 cookie 或 token。
需要带凭证(如 Cookie、Authorization header)
必须明确列出完整可信域名,不能用 *:
-
正确写法:
['https://myapp.com', 'http://localhost:3000'] -
错误写法:
['*']—— 浏览器会直接拒绝带凭证的请求,Laravel 挡不住也改不了 - 本地开发写
http://localhost:3000就行;http://localhost:*不被支持,通配符只认完整域名或 * - 同时要把
supports_credentials设为 true,前端 fetch 还得加credentials: 'include'
不需要传凭证(纯公开接口)
可以设为 ['*'],但仅限开发或完全公开场景:
-
'supports_credentials' => false必须显式配置,否则包默认可能为 true,导致冲突 - 生产环境慎用
['*'],有安全风险;建议按需写死域名 - 此时前端不用设
credentials,浏览器也不会附带 Cookie 或 Authorization
路径匹配和中间件配合也很重要
allowed_origins 生效的前提是请求走到 CORS 中间件,并且没被提前拦截:
- 确认该请求路径在
config/cors.php的'paths'里,比如['api/*'] - 检查路由没被
auth:sanctum等认证中间件包裹——OPTIONS 预检不带 token,会被直接拒掉 - 中间件注册顺序要对:放在
EncryptCookies后、认证中间件前,确保它有机会执行











