Laravel跨域报错本质是浏览器将localhost和127.0.0.1视为不同源,需在config/cors.php的allowed_origins中明确列出对应前端地址,如['http://localhost:3000','http://127.0.0.1:3000'],并确保HandleCors中间件置于$middleware数组顶部。

Laravel 接口跨域时,localhost 和 127.0.0.1 混用报错,本质不是域名“长得像”,而是浏览器把它们视为两个完全不同的源(origin)。当你前端用 http://localhost:3000 发请求,后端 allowed_origins 却只写了 ['http://127.0.0.1:8000'],或反过来,CORS 就会直接拒绝——连预检(OPTIONS)都过不去,控制台报错类似:
Access to fetch at 'http://127.0.0.1:8000/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy
这不是 Laravel 配置写错了,是 origin 匹配失败了。
✅ 明确区分:开发中该用哪个?
-
localhost是主机名(hostname),经 DNS 解析为127.0.0.1,但协议 + 域名 + 端口三者必须完全一致才被视作同源。 - 浏览器不认为
localhost:8000和127.0.0.1:8000同源,哪怕它们指向同一服务。
所以:
- 前端启动地址是
http://localhost:3000→ 后端allowed_origins必须包含http://localhost:3000 - 前端用
http://127.0.0.1:3000→ 后端就得写http://127.0.0.1:3000 - 两者都用?那就两个都列进去,别用
*
✅ 正确配置 config/cors.php
'allowed_origins' => [
'http://localhost:3000',
'http://127.0.0.1:3000',
'http://localhost:5173', // Vite 默认
'http://127.0.0.1:5173',
],
'supports_credentials' => true, // 如果前端带 credentials: 'include'
⚠️ 注意:
- 不要写
'http://localhost:*'—— 端口不能通配,非法 -
supports_credentials => true时,绝对禁止'allowed_origins' => ['*'],否则浏览器直接报错:A wildcard '*' cannot be used
✅ 确保中间件已全局启用
Laravel 9.2+ 自带 \Illuminate\Http\Middleware\HandleCors::class,但它必须放在 $middleware 数组顶部(紧接 TrustProxies 后),否则只对 api 路由组生效,而你可能直接用了 Route::get('/api/xxx') 这类裸路由:
// app/Http/Kernel.php
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class, // ← 必须放这里!
// ... 其他中间件
];
如果只加在 $middlewareGroups['api'] 里,而你的接口没套 middleware('api'),那中间件根本不会跑。
✅ 检查前端请求是否带凭据
- 如果 JS 中用了
fetch(..., { credentials: 'include' })或axios.defaults.withCredentials = true
→ 后端supports_credentials必须为true,且allowed_origins不能是* - 如果不需要传 cookie/token,可设
'supports_credentials' => false,此时allowed_origins才能安全用['*']
✅ 附:快速验证方法
在浏览器控制台执行:
// 查看当前页面 origin
window.location.origin // 输出类似 http://localhost:3000
// 检查请求发往哪
fetch('http://127.0.0.1:8000/api/test')
若两者不一致,就立刻同步 config/cors.php 中的 allowed_origins。
不复杂但容易忽略。











