【问题标题】:CORS errors with Symfony 4 & Nelmio CORS BundleSymfony 4 和 Nelmio CORS Bundle 的 CORS 错误
【发布时间】:2019-06-26 23:52:36
【问题描述】:

我一直试图弄清楚为什么我刚刚部署到我的 Apache 服务器上的 Symfony 4 API 应用程序会出现 CORS 问题,但无法理解这个问题。

config/packages/nelmio_cors.yaml

nelmio_cors:
    defaults:
        origin_regex: true
        allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
        allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
        allow_headers: ['Content-Type', 'Authorization']
        max_age: 3600
    paths:
        '^/': ~

.env

...
CORS_ALLOW_ORIGIN=/*/
...

我从 localhost 前端应用程序向该 API 发出的请求的所有响应均不包含 Access-Control-Allow-Origin 标头,并且我收到标准错误;

从源访问“http://my-api.com/foo”处的 XMLHttpRequest “http://localhost:4200”已被 CORS 策略阻止:响应 预检请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

没有发送任何特殊的标头,现在我已将允许的原始正则表达式设置为“全部”,因此我无法确定导致问题的原因。我什至在缓存中检查以确保从 env 变量中正确提取了原点,它就是这样。如果需要其他上下文/文件内容来提供帮助,请告诉我!

【问题讨论】:

  • 你确定你的 CORS_ALLOW_ORIGIN 变量。你试过 CORS_ALLOW_ORIGIN=* 吗?
  • @FlorianHermann 该变量被解释为正则表达式,但是是的,我已经尝试了这两个值

标签: symfony cors


【解决方案1】:

我总是尝试更具体地允许 CORS,例如:

CORS_ALLOW_ORIGIN=^http://(.*:8080|localhost:4200)$

如果您真的想启用所有来源,您可以尝试以下方式:

CORS_ALLOW_ORIGIN=^.*$

【讨论】:

    【解决方案2】:

    您的问题是您选择使用正则表达式 (origin_regex: true) 但未提供有效模式。

    如果您想使用origin_regex: true,那么您应该指定一个有效的模式,例如.*^.*$

    如果您不想使用正则表达式,请忽略 origin_regex 设置(或将其设置为 false),只需使用 * 作为您的 CORS_ALLOW_ORIGIN 值。

    【讨论】:

    • 即使有这个建议的改变也没什么区别,我假设有一些不相关的东西导致了这个,这很奇怪。
    【解决方案3】:

    我已经解决了这个问题,虽然表面上看起来与 CORS 配置有关,但实际上是服务器上的项目配置错误。

    TL;DR 是该项目缺少一个 .htaccess 文件,由于使用 Valet,我在开发中不需要该文件 - 按照说明 here 解决了该问题。

    【讨论】:

    • .htacess 的内容是什么?
    • @ALFA 它在答案中的链接中
    【解决方案4】:

    为什么需要 nelmio?

    您可以使用简单的事件侦听器(在 kernel.event_subscriber 上)添加这些标头。

    namespace App\EventListener\HttpKernel;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\KernelEvents;
    use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
    
    class CorsSubscriber implements EventSubscriberInterface
    {
    
        public static function getSubscribedEvents(): array
        {
            return [
                KernelEvents::RESPONSE => 'onResponse'
            ];
        }
    
        public function onResponse(FilterResponseEvent $filterResponseEvent)
        {
            $response = $filterResponseEvent->getResponse();
            $response->headers->set('Access-Control-Allow-Origin', '*');
        }
    }
    

    注册为 kernel.event_subscriber

        app.http_kernel.cors_subscriber:
            class: App\EventListener\HttpKernel\CorsSubscriber
            tags:
                - { name: kernel.event_subscriber }
    

    【讨论】:

    • 在生产模式下更认真地使用应用程序时,我希望对 CORS 进行更多限制,现在我只是尝试确认功能性的首次部署,即使在尽可能不受限制
    猜你喜欢
    • 2019-08-28
    • 2017-03-23
    • 2018-06-17
    • 2019-06-17
    • 1970-01-01
    • 2021-09-05
    • 2019-06-29
    • 2019-05-19
    • 2015-05-18
    相关资源
    最近更新 更多