Laravel 11 中严格限制仅允许 https://admin.example.com 访问 API,需在 config/cors.php 中设 allowed_origins 为 ['https://admin.example.com'](禁用通配符),supports_credentials 设为 true 时必须如此;确认 HandleCors 已注册于 $middlewareGroups['api'],且 API 路由使用 'api' 中间件组;配合 Sanctum 时需配置 SESSION_DOMAIN=.example.com 并清除配置缓存。

在 Laravel 11 中,要严格限制仅允许 https://admin.example.com 访问 API 接口,核心是配置 CORS 策略为精确域名白名单,并禁用通配符。Laravel 11 默认已集成 fruitcake/laravel-cors 的逻辑(无需手动安装),但必须正确配置和启用。
修改 config/cors.php 配置文件
确保 config/cors.php 中的关键项明确指定单一域名:
-
allowed_origins 设为
['https://admin.example.com']—— 不能写*,也不能漏掉https://协议 -
supports_credentials 若前端需携带 Cookie(如 Sanctum 登录态),设为
true;此时allowed_origins更不能用*,否则浏览器直接拒绝 -
paths 建议限定为 API 路径,例如
['api/*', 'sanctum/csrf-cookie'],避免非必要路径被误放行 -
allowed_methods 和 allowed_headers 按实际需要精简,如
['GET', 'POST', 'PUT', 'DELETE']和['Content-Type', 'Authorization', 'X-Requested-With']
确认中间件已注册到正确的路由组
Laravel 11 默认在 app/Http/Kernel.php 的 $middlewareGroups['api'] 中已包含 \Fruitcake\Cors\HandleCors::class。请检查确认:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 如果你的接口定义在
routes/api.php,且使用了Route::middleware('api'),则 CORS 自动生效 - 如果接口在
routes/web.php或自定义中间件组中,需手动将\Fruitcake\Cors\HandleCors::class加入对应组,或显式绑定到路由 - 不要加到全局
$middleware数组——这会导致所有请求(包括静态资源、健康检查等)都带 CORS 头,不必要且可能干扰 CDN 或反向代理
配合 Sanctum 时注意 SESSION_DOMAIN
若你用 Sanctum 管理登录态,且前端在 https://admin.example.com 下发起带 Cookie 的请求,必须设置:
-
SESSION_DOMAIN=.example.com(注意开头的点)在.env中 —— 这样 Cookie 才能被admin.example.com和后端域名(如api.example.com)共享 - 同时确保
config/session.php中'domain' => env('SESSION_DOMAIN', null)已启用 - 若后端域名与前端不在同一主域(如后端是
backend.com),则无法通过 Cookie 共享认证态,应改用 token 认证
验证与排查要点
部署后务必实测,重点看响应头是否符合预期:
- 用
curl -I https://your-api.com/api/users或浏览器开发者工具 Network 面板,检查响应头是否含:
Access-Control-Allow-Origin: https://admin.example.com(不是*)
Access-Control-Allow-Credentials: true(如果启用了凭据) - 若仍被拦截,检查是否 Nginx/Apache 层覆盖了响应头(例如服务器配置了
add_header Access-Control-Allow-Origin "*"),需删除或调整 - 清除 Laravel 配置缓存:
php artisan config:clear,避免旧配置残留 - 预检请求(OPTIONS)失败?确保
allowed_methods包含实际用到的方法,且中间件对 OPTIONS 请求也生效(fruitcake/laravel-cors默认处理)










