dnsoft / laravel-cors
为您的 Laravel 应用程序添加 CORS (跨源资源共享) 标头支持
Requires
- php: ^7.4|^8.0|^8.1
- fruitcake/php-cors: ^1.2
Requires (Dev)
- laravel/framework: ^6|^7.24|^8
- orchestra/testbench-dusk: ^4|^5|^6|^7
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-04 16:38:20 UTC
README
实现了 https://github.com/fruitcake/php-cors 以支持 Laravel
关于升级到 Laravel 9、10 或更高版本的用户注意
由于所有支持的 Laravel 版本现在都已将 CORS 中间件包含在核心中,因此此包已弃用。
自 Laravel 9.2 以来,此中间件已包含在 laravel/framework 中。您可以使用提供的中间件,它应与此包中提供的中间件和配置兼容。有关更改,请参阅 https://github.com/laravel/laravel/pull/5825/files。
升级步骤
- 从您的 composer.json 中删除
"fruitcake/laravel-cors"
- 将
app/Http/Kernel.php
中的\Fruitcake\Cors\HandleCors::class,
替换为\Illuminate\Http\Middleware\HandleCors::class,
有关高级用法,请参阅 https://github.com/fruitcake/php-cors
。配置保持不变。
关于
laravel-cors
包允许您通过 Laravel 中间件配置发送 Cross-Origin Resource Sharing 标头。
如果您想全面了解 CORS 工作流程,可以浏览此 图片。
从 0.x (barryvdh/laravel-cors) 升级
从 0.x 版本升级时,有一些破坏性更改
- 使用新的 'paths' 属性来启用/禁用特定路由上的 CORS。默认情况下为空,因此请正确填写!
- 不再支持中间件组,请使用全局中间件
- 供应商名称已更改(请参阅安装/使用说明)
cors.php
中的 props 的 casing 已从 camelCase 更改为 snake_case,因此如果您已经有一个cors.php
文件,您需要更新该文件中的 props 以匹配新的 casing。
功能
- 处理 CORS 预检 OPTIONS 请求
- 向您的响应添加 CORS 标头
- 匹配路由,仅对某些请求添加 CORS
安装
在您的 composer.json
中要求 fruitcake/laravel-cors
包并更新您的依赖项
composer require fruitcake/laravel-cors
如果您遇到冲突,这可能是因为安装了 barryvdh/laravel-cors 或 fruitcake/laravel-cors 的旧版本。首先删除冲突的包,然后尝试重新安装
composer remove barryvdh/laravel-cors fruitcake/laravel-cors composer require fruitcake/laravel-cors
全局使用
要允许所有路由的 CORS,请在 app/Http/Kernel.php
类的 $middleware
属性顶部添加 HandleCors
中间件
protected $middleware = [ \Fruitcake\Cors\HandleCors::class, // ... ];
现在更新配置以定义您要在其上运行 CORS 服务的路径(请参阅下文配置)
'paths' => ['api/*'],
配置
默认设置在 config/cors.php
中。发布配置以将文件复制到您自己的配置
php artisan vendor:publish --tag="cors"
注意:当使用自定义标头,如
X-Auth-Token
或X-Requested-With
时,您必须设置allowed_headers
以包括这些标头。您还可以将其设置为['*']
以允许所有自定义标头。
注意:如果您显式地列出标头,则必须包括
Origin
或请求将无法被识别为 CORS。
选项
allowed_origins
、allowed_headers
和 allowed_methods
可以设置为 ['*']
以接受任何值。
注意:对于
allowed_origins
,当不使用通配符时,必须包含方案,例如:['http://example.com', 'https://example.com']
。您还必须考虑到在使用allowed_origins_patterns
时方案将存在。
注意:尽量具体。您可以从宽松的约束开始开发,但最好尽可能严格!
注意:由于Laravel中的HTTP方法覆盖,允许POST方法也将使API用户能够执行PUT和DELETE请求。
注意:有时需要指定端口(例如,当您在本地环境中编写应用程序时)。您也可以在这里指定端口或使用通配符,例如:
localhost:3000
、localhost:*
或者甚至使用FQDNapp.mydomain.com:8080
Lumen
在Lumen中,只需手动在您的bootstrap/app.php
文件中注册ServiceProvider。
$app->register(Fruitcake\Cors\CorsServiceProvider::class);
还将cors.php配置文件复制到config/cors.php
,并投入行动。
$app->configure('cors');
Lumen的全球使用
要允许所有路由的CORS,请将HandleCors
中间件添加到全局中间件,并在配置中设置paths
属性。
$app->middleware([ // ... Fruitcake\Cors\HandleCors::class, ]);
常见问题
错误的配置
确保配置中的path
选项正确,并且实际上与您使用的路由相匹配。记得清除配置缓存。
错误处理、中间件顺序
有时错误/返回自己响应的中间件可能会阻止CORS中间件的运行。尝试更改中间件的顺序,并确保它是全局中间件中的第一个条目,而不是路由组的一部分。同时检查日志中的实际错误,因为没有CORS,错误将被浏览器吞没,只会显示CORS错误。还尝试在没有CORS的情况下运行,以确保它实际上可以工作。
授权头/凭证
如果您的请求包含授权头或使用凭证模式,请在配置中将supports_credentials
的值设置为true。这将设置Access-Control-Allow-Credentials头为true
。
echo/die
如果您在代码中使用echo()
、dd()
、die()
、exit()
、dump()
等,您将破坏中间件流程。当输出在头之前发送时,无法添加CORS。当脚本在CORS中间件完成之前退出时,将不会添加CORS头。始终返回适当的响应或抛出异常。
禁用API的CSRF保护
如果可能,请使用禁用CSRF保护的route group。否则,您可以在App\Http\Middleware\VerifyCsrfToken
中为某些请求禁用CSRF。
protected $except = [ 'api/*', 'sub.domain.zone' => [ 'prefix/*' ], ];
重复头
CORS中间件应该是您添加这些头的唯一地方。如果您还在.htaccess、nginx或您的index.php文件中添加头,您将得到重复的头和意外的结果。
无跨站请求
如果您不做跨站请求,这意味着如果您不是从site-b.com请求site-a.com/api,您的浏览器将不会发送Origin: https://site-b.com
请求头,CORS将“禁用”,因为也将缺少Access-Control-Allow-Origin
头。这是因为请求是从同一个源发出的,在这种情况下不需要保护。
许可证
在MIT许可证下发布,请参阅LICENSE。