cindyullmann / laminas-cors
Laminas模块,让您轻松处理CORS请求
Requires
- php: ^7.4 || ~8.0.0 || ~8.1.0
- laminas/laminas-eventmanager: ^3.5
- laminas/laminas-http: ^2.15
- laminas/laminas-mvc: ^3.3
- laminas/laminas-servicemanager: ^3.14
Requires (Dev)
- laminas/laminas-i18n: ^2.16
- laminas/laminas-log: ^2.15
- laminas/laminas-modulemanager: ^2.11
- laminas/laminas-serializer: ^2.13
- laminas/laminas-test: ^4.0
- laminas/laminas-view: ^2.21
- squizlabs/php_codesniffer: ^3.6
Suggests
README
LaminasCors是一个简单的Laminas模块,可以帮助您处理跨源资源共享(CORS)。
什么是LaminasCors?
LaminasCors是Laminas框架模块,允许您轻松配置Laminas应用程序,以便它自动构建遵循CORS文档的HTTP响应。
安装
通过输入以下命令安装模块(或将它添加到您的composer.json
文件中)
$ php composer.phar require cindyullmann/laminas-cors
然后,在您的application.config.php
文件中添加"LaminasCors"以启用它。
默认情况下,LaminasCors配置为拒绝所有CORS请求。要更改此设置,您需要将config/laminas_cors.global.php.dist
文件复制到您的autoload
文件夹中(删除.dist
扩展名),并根据您的需求进行修改。
文档
什么是CORS?
CORS是一种机制,允许浏览器执行跨源请求。
例如,假设您的网站托管在域名http://example.com
上。默认情况下,出于安全原因,用户代理不允许对另一个域名执行AJAX请求(例如http://funny-domain.com
)。
使用CORS,您可以允许服务器响应对此类请求。
您可以在网络上找到有关CORS如何工作的更详细的文档
事件注册
LaminasCors将LaminasCors\Mvc\CorsRequestListener
注册到MvcEvent::EVENT_ROUTE
事件,优先级为-1。这意味着该监听器在路由匹配之后执行。
配置模块
默认情况下,所有选项都是全局设置,适用于所有路由
allowed_origins
:(数组) 允许的源列表。要允许任何源,您可以使用通配符(*
)字符。如果指定了多个源,LaminasCors将自动检查"Origin"
头部的值,并在响应头中仅返回允许的域名(如果有的话)。要允许任何子域,您可以使用通配符字符作为域名的前缀(例如*.example.com
)。请注意,您不需要添加您的主机URI(因此,如果您的网站托管为"example.com",则"example.com"自动允许)。allowed_methods
:(数组) 允许的HTTP方法列表。这些方法将在预检请求中返回,以指示对用户代理允许哪些方法。allowed_headers
:(数组) 将返回的允许的头部列表,用于预检请求。这指示用户代理在实际请求中允许发送哪些头部。max_age
:(整数) 预检请求应该由用户代理缓存的秒数。这可以防止用户代理为每个请求发送预检请求。exposed_headers
:(数组) 允许在用户代理中读取的响应头部列表。请注意,某些浏览器可能没有正确实现此功能。allowed_credentials
:(布尔值) 如果为真,则允许浏览器将cookies与请求一起发送。
如果您想配置特定路由,您可以在路由配置中添加LaminasCors\Options\CorsOptions::ROUTE_PARAM
。
<?php return [ 'laminas_cors' => [ 'allowed_origins' => ['*'], 'allowed_methods' => ['GET', 'POST', 'DELETE'], ], 'router' => [ 'routes' => [ 'readOnlyRoute' => [ 'type' => 'literal', 'options' => [ 'route' => '/foo/bar', 'defaults' => [ // This will replace allowed_methods configuration to only allow GET requests // and only allow a specific origin instead of the wildcard origin LaminasCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_origins' => ['http://example.org'], 'allowed_methods' => ['GET'], ], ], ], ], 'someAjaxCalls' => [ 'type' => 'literal', 'options' => [ 'route' => '/ajax', 'defaults' => [ // This overrides the wildcard origin LaminasCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_origins' => ['http://example.org'], ], ], ], 'may_terminate' => false, 'child_routes' => [ 'blog' => [ 'type' => 'literal', 'options' => [ 'route' => '/blogpost', 'defaults' => [ // This would only allow `http://example.org` to GET this route \LaminasCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_methods' => ['GET'], ], ], ], 'may_terminate' => true, 'child_routes' => [ 'delete' => [ 'type' => 'segment', 'options' => [ 'route' => ':id', // This would only allow origin `http://example.org` to apply DELETE on this route 'defaults' => [ \LaminasCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_methods' => ['DELETE'], ], ], ], ], ], ], ], ], ], ], ];
预检请求
如果LaminasCors检测到预检CORS请求,将创建一个新的HTTP响应,并根据您的配置发送适当的头部信息。响应将以200状态码(OK)发送。
请注意,这也会阻止进一步的MVC步骤执行,因为所有后续的MVC步骤都会跳过,直到到达Laminas\Mvc\MvcEvent::EVENT_FINISH
,该事件负责实际发送响应。
实际请求
当发起实际请求时,LaminasCors首先检查源是否允许。如果不允许,将创建一个新的响应,并带有403状态码(禁止)发送。
请注意,这也会阻止进一步的MVC步骤执行,因为所有后续的MVC步骤都会跳过,直到到达Laminas\Mvc\MvcEvent::EVENT_FINISH
,该事件负责实际发送响应。
如果源允许,LaminasCors将仅向由Laminas\Mvc
生成的请求添加适当的头部信息。
安全注意事项
请勿使用此模块来保护您的应用程序!您必须使用适当的授权模块。
LaminasCors仅允许接受或拒绝跨源请求。
自定义方案
内部,LaminasCors使用Laminas\Uri\UriFactory
类。如果您使用自定义方案(例如,如果您正在使用某些Google Chrome扩展测试API),您需要通过将它们添加到UriFactory
配置中来支持这些方案(请参阅文档)。
示例
要将chrome-extension
自定义方案注册到您的API中,只需添加以下内容:
UriFactory::registerScheme('chrome-extension', 'Laminas\Uri\Uri');
到module/Application/Module.php
中的onBootstrap()
方法。请注意,如果您的IDE无法自动解析,您应该在同一文件中添加以下use
定义:
use Laminas\Uri\UriFactory;
以这种方式注册chrome-extension
自定义方案允许您使用Google Chrome扩展来测试您的API。