浏览器强制规定:携带凭证时Access-Control-Allow-Origin不能为,必须精确匹配Origin;否则静默拦截,即使Laravel返回也无效,且需同步配置supports_credentials=true、credentials: 'include'及allowed_headers。

因为浏览器强制规定:只要请求携带 Cookie、Authorization 等凭证(即前端设了 credentials: 'include'),Access-Control-Allow-Origin 响应头就**绝对不能是 *** —— 这是 W3C 标准的硬性限制,Laravel 挡不住,也改不了。
allowed_origins设为['*']时会发生什么
当 supports_credentials => true 且 allowed_origins 是 ['*'],Laravel 仍会返回 Access-Control-Allow-Origin: *,但浏览器在收到这个响应后,会直接静默拦截整个请求。你甚至看不到网络面板里的预检(OPTIONS)或主请求,控制台只报“CORS 头缺失”或“不支持凭据的通配符源”,连错误详情都不给。
为什么必须写死完整域名
浏览器要求带凭证的跨域响应中,Access-Control-Allow-Origin 的值必须与请求头中的 Origin **完全一致**(字符级匹配,含协议、域名、端口)。所以:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
https://myapp.com请求 → 响应头必须是Access-Control-Allow-Origin: https://myapp.com -
http://localhost:3000请求 → 响应头必须是Access-Control-Allow-Origin: http://localhost:3000 -
http://localhost:8080不在列表里?直接拒绝,哪怕只差一个端口
配套配置缺一不可
只改 allowed_origins 不够,下面三项必须同步满足:
-
'supports_credentials' => true显式开启(不能依赖默认值) - 前端 fetch 或 axios 必须带
credentials: 'include' -
allowed_headers要包含'Authorization'和'Cookie'(如果前端实际发送)
本地开发常见误区
http://localhost:* 或 http://127.0.0.1:3000 和 http://localhost:3000 视为不同源,浏览器不认通配端口。开发时务必写全:['http://localhost:3000', 'http://127.0.0.1:3000'],否则本地联调会失败。

















