Laravel 10在PHP 8.1下配置CORS需用fruitcake/laravel-cors包,正确设置allowed_origins、supports_credentials联动规则,并将HandleCors中间件置于api组中EncryptCookies和StartSession之后、认证中间件之前。

在 PHP 8.1 环境下配置 Laravel 10 的 CORS,核心是让浏览器预检请求(OPTIONS)能通过、响应头正确返回,且不破坏现有鉴权或会话逻辑。关键不在“能不能配”,而在于“配得准不准”——尤其要注意 supports_credentials 与 allowed_origins 的联动规则,以及中间件注册位置是否合理。
确认基础环境已就绪
PHP 8.1 必须真实启用以下扩展:fileinfo(必选)、mbstring、openssl、pdo、xml、json、ctype、tokenizer。缺 fileinfo 会导致 composer install 直接失败;缺 mbstring 或 json 则 Laravel 启动即报错。用命令验证:
-
Linux/macOS:
php -m | grep -E "(fileinfo|mbstring|openssl|pdo|xml|json)" -
Windows(XAMPP/WAMP):进面板 → PHP 扩展管理 → 勾选上述模块,并检查 php.ini 中对应
extension=行是否取消注释
推荐方式:用 fruitcake/laravel-cors 包统一管理
这是 Laravel 官方实践路径,适配 Laravel 10,自动处理预检、动态头注入、凭证支持等细节。
- 执行安装:
composer require fruitcake/laravel-cors - 发布配置:
php artisan vendor:publish --tag="cors",生成config/cors.php - 编辑
config/cors.php,重点设好这几项:'paths' => ['api/*'],'allowed_origins' => ['http://localhost:3000', 'https://your-fe.com'],'allowed_methods' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],'allowed_headers' => ['Content-Type', 'Authorization', 'X-Requested-With'],'supports_credentials' => true(若前端 fetch 要传 cookie 或 token) - 在
app/Http/Kernel.php的$middlewareGroups['api']数组中加入:\Fruitcake\Cors\HandleCors::class(不要加到全局$middleware,避免干扰静态资源)
注意两个易错点
很多问题不是配置没写,而是写法冲突或顺序不对:
立即学习“PHP免费学习笔记(深入)”;
-
allowed_origins 不能为 ['*'] 时启用 supports_credentials:浏览器硬性限制,设了
'supports_credentials' => true却留'allowed_origins' => ['*'],请求会直接被拦截,控制台只报“CORS header ‘Access-Control-Allow-Origin’ cannot be the wildcard ‘*’” -
中间件位置必须靠前:在
$middlewareGroups['api']中,HandleCors::class应放在EncryptCookies::class和StartSession::class之后、但要在任何需要 session 或 auth 的中间件之前。否则预检请求可能被认证中间件拒掉
调试建议:用 curl 快速验证 OPTIONS 响应
别只等前端报错,直接测后端是否响应正确:
- 运行:
curl -I -X OPTIONS http://localhost:8000/api/test - 看返回头里有没有这三项:
Access-Control-Allow-Origin: http://localhost:3000Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Credentials: true(如果启用了 credentials)



















