lm-commons / lmc-cors
Laminas MVC模块,让您处理CORS请求
Requires
- php: ^8.1 | ^8.2
- laminas/laminas-eventmanager: ^2.6.4 || ^3.2.1
- laminas/laminas-http: ^2.10
- laminas/laminas-mvc: ^2.7.15 || ^3.1.1
- laminas/laminas-servicemanager: ^2.7.9 || ^3.4.0
Requires (Dev)
- laminas/laminas-component-installer: ^3.4
- laminas/laminas-i18n: ^2.9
- laminas/laminas-log: ^2.10
- laminas/laminas-modulemanager: ^2.7.2
- laminas/laminas-serializer: ^2.8
- laminas/laminas-view: ^2.8.1
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^9.5.0
- squizlabs/php_codesniffer: ^3.4
Replaces
- laminas-commons/lmc-cors: v1.0.1
- 1.4.x-dev
- 1.3.x-dev
- v1.3.1
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.2
- v1.0.1
- v1.0.0
- dev-dependabot/npm_and_yarn/docs/micromatch-4.0.8
- dev-dependabot/npm_and_yarn/docs/webpack-5.94.0
- dev-renovate/prism-react-renderer-2.x-lockfile
- dev-renovate/laminas-laminas-servicemanager-4.x
- dev-master
- dev-dependabot/npm_and_yarn/docs/ws-7.5.10
This package is auto-updated.
Last update: 2024-09-10 17:42:57 UTC
README
LmcCors是一个简单的Laminas MVC模块,可以帮助您处理跨源资源共享(CORS)。
什么是LmcCors?
LmcCors是一个Laminas MVC模块,允许您轻松配置Laminas MVC应用程序,以便它自动构建遵循CORS文档的HTTP响应。
安装
通过输入以下命令安装模块(或将其添加到您的composer.json
文件):
$ composer require lm-commons/lmc-cors
然后,通过在您的application.config.php
或modules.config.php
文件中添加"LmcCors"来启用它。或者,Laminas组件安装程序将在安装期间将模块添加到配置中。
默认情况下,LmcCors配置为拒绝所有CORS请求。要更改此设置,您需要将config/lmc_cors.global.php.dist
文件复制到您的autoload
文件夹中(删除.dist
扩展名),并根据您的需求进行修改。
文档
什么是CORS?
CORS是一种机制,允许您的浏览器执行跨源请求。
例如,假设您的网站托管在http://example.com
域名下。默认情况下,由于安全原因(例如http://funny-domain.com
),用户代理将不允许执行对另一个域的AJAX请求。
通过CORS,您可以允许您的服务器响应此类请求。
您可以在网上找到有关CORS如何工作的更详细文档
事件注册
LmcCors将LmcCors\Mvc\CorsRequestListener
注册到MvcEvent::EVENT_ROUTE
事件,优先级为2。这意味着此监听器在路由匹配之前执行。
配置模块
默认情况下,所有选项都是全局设置的,适用于所有路由
allowed_origins
: (数组)允许的源列表。要允许任何源,您可以使用通配符(*
)字符。如果指定了多个源,LmcCors将自动检查"Origin"
头部的值,并仅将允许的域(如果有)返回到"Allow-Access-Control-Origin"
响应头。要允许任何子域,您可以将通配符字符添加到域名前面(例如*.example.com
)。请注意,您不需要添加您的宿主URI(因此,如果您的网站托管在"example.com",则"example.com"自动允许)。allowed_methods
: (数组)允许的HTTP方法列表。这些方法将返回到预检请求,以指示哪些方法允许用户代理执行。您甚至可以指定自定义HTTP动词。allowed_headers
: (数组)允许的头部列表,将返回给预检请求。这表明用户代理在执行实际请求时可以发送哪些头部。max_age
: (整数)预检请求应在用户代理中缓存的(秒)最大年龄。这可以防止用户代理为每个请求发送预检请求。exposed_headers
: (数组)允许在用户代理中读取的响应头部列表。请注意,一些浏览器可能没有正确实现此功能。allowed_credentials
: (布尔值)如果为true,则允许浏览器在请求中发送cookie。
如果您想配置特定路由,可以将 LmcCors\Options\CorsOptions::ROUTE_PARAM
添加到您的路由配置中。
<?php return [ 'lmc_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 LmcCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_origins' => ['http://example.org'], 'allowed_methods' => ['GET'], ], ], ], ], 'someAjaxCalls' => [ 'type' => 'literal', 'options' => [ 'route' => '/ajax', 'defaults' => [ // This overrides the wildcard origin LmcCors\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 \LmcCors\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' => [ \LmcCors\Options\CorsOptions::ROUTE_PARAM => [ 'allowed_methods' => ['DELETE'], ], ], ], ], ], ], ], ], ], ], ];
预检请求
当 LmcCors 检测到预检 CORS 请求时,将创建一个新的 HTTP 响应,并根据您的配置发送适当的头部信息。响应将始终以 200 状态码(OK)发送。
请注意,这将阻止进一步执行 MVC 步骤,因为所有后续的 MVC 步骤都将跳过,直到 Laminas\Mvc\MvcEvent::EVENT_FINISH
,该事件负责实际发送响应。
实际请求
当发出实际请求时,LmcCors 首先检查源是否允许。如果不允许,则创建一个新的带有 403 状态码(禁止)的响应并发送。
请注意,这将阻止进一步执行 MVC 步骤,因为所有后续的 MVC 步骤都将跳过,直到 Laminas\Mvc\MvcEvent::EVENT_FINISH
,该事件负责实际发送响应。
如果源允许,LmcCors 将仅向由 Laminas\Mvc
生成的请求添加适当的头部信息。
安全注意事项
请不要使用此模块来保护您的应用程序!您必须使用合适的授权模块,如 BjyAuthorize、LmcRbacMvc 或 SpiffyAuthorize。
LmcCors 只允许接受或拒绝跨源请求。
自定义方案
内部,LmcCors 使用 Laminas\Uri\UriFactory
类。如果您使用自定义方案(例如,如果您正在使用某些 Google Chrome 扩展程序测试您的 API),您需要通过将它们添加到 UriFactory
配置中来实现对这些方案的支持(请参阅文档)。
示例
要将 chrome-extension
自定义方案注册到您的 API 中,只需将以下内容添加到 module/Application/Module.php
中的 onBootstrap()
方法中:
use Laminas\Uri\UriFactory; UriFactory::registerScheme('chrome-extension', 'Laminas\Uri\Uri');
以这种方式注册 chrome-extension
自定义方案允许您使用 Google Chrome 扩展程序来测试您的 API。