Symfony 4和Nelmio CORS捆绑包的CORS错误

时间:2019-02-02 17:54:10

标签: symfony cors

我一直试图弄清楚为什么我刚刚部署到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”标头   资源。

没有发送特殊的标头,现在我已经将允许的源正则表​​达式设置为“ all”,所以我无法弄清楚导致此问题的原因。我什至在缓存中进行了检查,以确保已从env变量中正确提取了原点。如果需要其他上下文/文件内容来协助您,请告诉我!

4 个答案:

答案 0 :(得分:0)

我总是尝试更加具体地允许CORS之类:

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

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

CORS_ALLOW_ORIGIN=^.*$

答案 1 :(得分:0)

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

如果要使用origin_regex: true,则应指定有效模式,例如.*^.*$

如果您不想使用正则表达式,请省略origin_regex设置(或将其设置为false),而仅将*用作您的CORS_ALLOW_ORIGIN

答案 2 :(得分:0)

我已经解决了该问题,尽管从表面上看它似乎与CORS配置有关,但实际上是服务器上项目的错误配置。

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

答案 3 :(得分:-2)

为什么需要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 }