shiftonelabs / laravel-cors
在全局或按路由级别为Laravel应用启用CORS。
Requires
- php: >=5.5.0
- illuminate/config: >=5.1
- illuminate/container: >=5.1
- illuminate/contracts: >=5.1
- illuminate/http: >=5.1
- illuminate/routing: >=5.1
- illuminate/support: >=5.1
- laravel/framework: >=5.1
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
- shiftonelabs/codesniffer-standard: 0.*
- squizlabs/php_codesniffer: 2.*
This package is auto-updated.
Last update: 2024-09-21 21:01:42 UTC
README
这个Laravel包提供了在Laravel应用程序中启用CORS请求的支持。如果需要基本CORS支持,还有两个其他流行的包被广泛使用(barryvdh/laravel-cors 和 spatie/laravel-cors)。
这个包试图解决其他包的一些问题。这些问题不是致命的,所以如果您不关心这些问题,可能需要查看其他包。
1. 多配置
虽然其他包支持将CORS中间件应用于特定路由,但它们仍然只支持一个全局配置。因此,例如,如果您希望一组路由仅对一个源可用,而另一组路由对不同的源可用,则无法创建这样的配置而不使这两组路由都对两个源可用。
这个包允许指定多个配置,可以根据需要按路由应用。
2. 错误处理
在其他包中,如果在应用CORS中间件之前发生错误,则不会将CORS头添加到错误响应中。在这种情况下,您不会收到带有错误的响应,而是会收到无效的CORS请求错误,并且无法访问响应。
这个包确保即使在发生错误的情况下,也会应用CORS配置到请求中。
3. 预检问题
-
响应状态码 - 两个包都为拒绝的预检请求返回4xx状态码。预检请求应返回2xx状态码,只是需要正确设置(或未设置)CORS响应头。这个包为所有预检请求返回204无内容响应。
-
响应头 - 两个包不设置任何拒绝的预检请求的头。对于无效的源来说这是合适的,但如果预检因为方法或头而被拒绝,则应该添加适当的响应头,以便客户端确定正确的拒绝原因。如果没有响应头,所有拒绝原因都将归因于无效的源。这个包试图根据拒绝场景智能地设置响应头。
版本
这个包适用于Laravel 5.1至Laravel 6.x。它目前不支持Lumen。这个包使用中间件,因此不支持Laravel < 5.0。这个包需要Kernel::hasMiddleware()
方法,因此不支持Laravel 5.0。
安装
通过Composer
$ composer require shiftonelabs/laravel-cors
一旦更新了composer并安装了包,就需要加载服务提供者。
Laravel 5.5+, 6.x (5.5, 5.6, 5.7, 5.8, 6.x)
这个包使用自动包发现。服务提供者将自动注册。
Laravel 5.1 - 5.4
打开config/app.php
并在提供者数组中添加以下行
ShiftOneLabs\LaravelCors\LaravelCorsServiceProvider::class,
配置
这个包包含一个默认的配置文件,可以发布以对其进行修改。
php artisan vendor:publish --provider="ShiftOneLabs\LaravelCors\LaravelCorsServiceProvider" --tag="config"
这将发布配置文件到 config/cors.php
。修改此配置文件以更改默认配置文件并添加新的自定义配置文件。
用法
全局中间件
要应用全局 CORS 政策,将 \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy
中间件添加到 app/Http/Kernel.php
文件中的全局 $middleware
属性。此全局 CORS 政策将使用在 cors.php
配置文件中定义的默认配置文件中的配置文件。默认情况下,这是一个开放的策略,将允许所有 CORS 请求。
protected $middleware = [ /* ... */, \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy::class, ]
路由中间件
要应用特定路由的 CORS 政策,首先在 app/Http/Kernel.php
文件中将策略中间件的别名添加到 $routeMiddleware
属性中。
protected $routeMiddleware = [ /* ... */, 'cors.policy' => \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy::class, ]
现在,您可以将此中间件添加到任何路由或路由组。此外,此路由中间件可以接受一个参数,以指定在 cors.php
配置文件中定义的 CORS 配置文件。
假设您已将以下配置文件添加到配置文件中
'profiles' => [ /* ... */, // add a new CORS profile named "app1" 'app1' => [ 'allowedMethods' => ['*'], 'allowedOrigins' => ['example.com'], 'allowedOriginsPatterns' => [], 'allowedHeaders' => ['*'], 'exposedHeaders' => [], 'maxAge' => 0, 'supportsCredentials' => false, ], ],
您可以使用路由中间件将此新的 CORS 配置文件应用到任何路由或路由组
Route::get('example-route', 'ExampleController@index')->middleware('cors.policy:app1');
现在,此路由将仅允许来自 example.com
的 CORS 请求。来自其他来源的 CORS 请求将被拒绝。
多个中间件
请求可能需要通过多个定义的策略。例如,如果您有一个全局 CORS 策略、一个组中间件策略和一个特定路由策略,则请求必须通过所有三个策略的要求。
如果请求失败,将使用最不具体(全局)到最具体(路由)的第一个失败策略构建响应头。
如果请求成功,将使用请求通过的最后策略构建响应头。
贡献
欢迎贡献。请参阅 CONTRIBUTING 以获取详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 patrick@shiftonelabs.com 而不是使用问题跟踪器。
替代方案
- barryvdh/laravel-cors:为 Laravel/Lumen 应用添加 CORS 支持的最受欢迎的包之一。如果您需要简单的支持,请选择此包。
- spatie/laravel-cors:社区中知名的包提供商的另一个 Laravel/Lumen CORS 实现。此包比 barryvdh/laravel-cors 包提供了更多的灵活性。
致谢
许可
MIT 许可证(MIT)。请参阅 许可文件 以获取更多信息。