NelmioCorsBundle
NelmioCorsBundle 允许您发送跨域资源共享标头,并使用 ACL 风格的按 URL 配置。
如果您需要,请查看此流程图,以全面了解整个 CORS 工作流程。
安装
在您的 composer.json 文件中需要 nelmio/cors-bundle
包并更新您的依赖项
1
$ composer require nelmio/cors-bundle
该扩展包应该由 Symfony Flex 自动启用。如果您不使用 Flex,您需要通过在项目的 config/bundles.php
文件中添加以下行来手动启用该扩展包
1 2 3 4 5 6 7 8
<?php
// config/bundles.php
return [
// ...
Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true],
// ...
];
如果您的项目中没有 config/bundles.php
文件,则您可能正在使用旧版本的 Symfony。在这种情况下,您应该有一个 app/AppKernel.php
文件。编辑该文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<?php
// app/AppKernel.php
// ...
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = [
// ...
new Nelmio\CorsBundle\NelmioCorsBundle(),
];
// ...
}
// ...
}
配置
Symfony Flex 在 config/packages/nelmio_cors.yaml
中生成默认配置。
在 defaults
下定义的选项是应用于所有匹配的 paths
的默认值,除非在特定的 URL 配置中被覆盖。如果您希望它们应用于所有内容,您必须定义一个路径为 ^/
。
此示例配置包含所有可能的配置值,其默认值显示在 defaults
键中。在 paths 中,您可以看到我们允许来自任何来源的 /api/
上的 CORS 请求。一个自定义标头和一些 HTTP 方法也被定义为允许的。预检请求可以缓存 3600 秒。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
allow_private_network: false
expose_headers: []
max_age: 0
hosts: []
origin_regex: false
forced_allow_origin_value: ~
skip_same_as_origin: true
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
'^/':
origin_regex: true
allow_origin: ['^https://127.0.0.1:[0-9]+']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
hosts: ['^api\.']
allow_origin
和 allow_headers
可以设置为 *
以接受任何值,但允许的方法必须显式列出。paths
必须至少包含一项。
expose_headers
可以设置为 *
以接受任何值,只要 allow_credentials
和 allow_private_network
按照规范为 false。
如果设置了 origin_regex
,allow_origin
必须是匹配允许来源的正则表达式列表。请记住使用 ^
和 $
来明确定义正则表达式的边界。
默认情况下,Access-Control-Allow-Origin
响应标头值是 Origin
请求标头值(如果它与您使用 allow_origin
定义的规则匹配),因此对于大多数用例来说应该没问题。如果不是,您可以使用 forced_allow_origin_value
设置您想要的确切值来覆盖此行为。
请注意,即使您将 forced_allow_origin_value
设置为 *
,如果您还将 allow_origin
设置为 http://example.com
,则只有此特定域将被允许访问您的资源。
注意
如果您允许 POST 方法并在框架中启用了 HTTP 方法覆盖,它将使 API 用户也能够执行 PUT 和 DELETE 请求。
实践指南
如何在 New Relic 上忽略预检请求?
在具有大部分经过身份验证的 API 的特定架构上,预检请求可能占流量的很大一部分。
在这种情况下,您可能不需要在 New Relic 上监控此流量,顺便说一下,New Relic 会自动将其归类为 unknown
。
可以编写一个请求监听器来忽略预检请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
class PreflightIgnoreOnNewRelicListener
{
public function onKernelResponse(FilterResponseEvent $event)
{
if (!extension_loaded('newrelic')) {
return;
}
if ('OPTIONS' === $event->getRequest()->getMethod()) {
newrelic_ignore_transaction();
}
}
}
注册此监听器,瞧!