fruitcake / laravel-cors
在您的Laravel应用中添加CORS(跨源资源共享)头部支持
Requires
- php: ^7.4|^8.0
- fruitcake/php-cors: ^1.2
- illuminate/contracts: ^6|^7|^8|^9
- illuminate/support: ^6|^7|^8|^9
Requires (Dev)
- laravel/framework: ^6|^7.24|^8
- orchestra/testbench-dusk: ^4|^5|^6|^7
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.5
- dev-master / 3.0.x-dev
- v3.0.0
- 2.2.x-dev
- v2.2.0
- v2.1.0
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v2.0.0-beta3
- v2.0.0-beta2
- v2.0.0-beta1
- 1.0.x-dev
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- 0.11.x-dev
- v0.11.4
- v0.11.3
- v0.11.2
- v0.11.1
- v0.11.0
- v0.10.1
- v0.10.0
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- v0.8.6
- v0.8.5
- V0.8.4
- v0.8.3
- v0.8.2
- v0.8.1
- v0.8.0
- v0.7.3
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- 0.3.x-dev
- v0.3.0
- 0.2.x-dev
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.2
- v0.1.1
- v0.1
- dev-barryvdh-deprecate
- dev-feat-lazyoptions
- dev-develop
- dev-feat-groupmiddleware
- dev-barryvdh-test-laravel9
- dev-test-single
- dev-feat-prependmiddleware
- dev-feat-middlewaretest
- dev-feat-browsertests
- dev-feat-actions
- dev-v1-backport
This package is auto-updated.
Last update: 2023-02-16 09:50:58 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中间件配置发送 跨源资源共享 头部。
如果您想了解CORS工作流程的全球概述,可以浏览此 图片。
从0.x (barryvdh/laravel-cors) 升级
从0.x版本升级时,有一些破坏性更改
- 使用新的 'paths' 属性来启用/禁用特定路由上的CORS。默认情况下为空,所以请正确填写!
- 不再支持分组中间件,使用全局中间件
- 供应商名称已更改(请参阅安装/使用说明)
- 在
cors.php
中的属性大小写已从camelCase更改为snake_case,因此如果您已经有了一个cors.php
文件,您需要更新该文件中的属性以匹配新的大小写。
功能
- 处理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。
选项
选项 | 描述 | 默认值 |
---|---|---|
paths | 您可以为1个或多个路径启用CORS,例如['api/*'] |
[] |
allowed_methods | 匹配请求方法。 | ['*'] |
allowed_origins | 匹配请求源。可以使用通配符,例如*.mydomain.com 或mydomain.com:* |
['*'] |
allowed_origins_patterns | 使用preg_match 匹配请求源。 |
[] |
allowed_headers | 设置Access-Control-Allow-Headers响应头。 | ['*'] |
exposed_headers | 设置Access-Control-Expose-Headers响应头。 | [] |
max_age | 设置Access-Control-Max-Age响应头。 | 0 |
supports_credentials | 设置Access-Control-Allow-Credentials头。 | false |
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 保护的路由组。否则,您可以在 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。