luminouslabs / ll-laravel-cors
在您的Laravel应用程序中添加CORS(跨源资源共享)头部支持
Requires
- php: >=7.2
- asm89/stack-cors: ^2.0.1
- illuminate/contracts: ^6|^7|^8|^9|^10
- illuminate/support: ^6|^7|^8|^9|^10
- symfony/http-foundation: ^4|^5|^6
- symfony/http-kernel: ^4.3.4|^5|^6
Requires (Dev)
- laravel/framework: ^6|^7.24|^8|^9|^10
- orchestra/testbench-dusk: ^4|^5|^6|^7|^8
- phpunit/phpunit: ^6|^7|^8|^9
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-16 12:37:07 UTC
README
由于所有支持的Laravel版本现在都包含在核心中的CORS中间件,因此此包已弃用。
自Laravel 9.2起,此中间件包含在laravel/framework中。您可以使用提供的中间件,它应该与此包中提供的中间件和配置兼容。有关更改,请参阅https://github.com/laravel/laravel/pull/5825/files。
功能
- 处理CORS预检OPTIONS请求
- 向您的响应添加CORS头部
- 将路由与仅向某些请求添加CORS相匹配
安装
在您的composer.json
中要求安装luminouslabs/ll-laravel-cors
包并更新您的依赖关系
composer require luminouslabs/ll-laravel-cors
如果您遇到冲突,这可能是因为安装了luminouslabs/ll-laravel-cors的较旧版本。首先删除冲突的包,然后再次尝试安装
composer remove barryvdh/laravel-cors fruitcake/laravel-cors composer require luminouslabs/ll-laravel-cors
全局使用
要允许所有路由的CORS,请将HandleCors
中间件添加到app/Http/Kernel.php
类中的$middleware
属性的顶部
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);
$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()
、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
头也将缺失。这是因为请求是从同一源发出的,在这种情况下不需要保护。