跳转到内容

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_originallow_headers 可以设置为 * 以接受任何值,但允许的方法必须显式列出。paths 必须至少包含一项。

expose_headers 可以设置为 * 以接受任何值,只要 allow_credentialsallow_private_network 按照规范为 false。

如果设置了 origin_regexallow_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();
        }
    }
}

注册此监听器,瞧!

这项工作,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本