1

我在 Symfony3 下使用 NelmioCorsBundle,设置如下:

nelmio_cors:
        defaults:
            allow_credentials: false
            allow_origin: []
            allow_headers: []
            allow_methods: []
            expose_headers: []
            max_age: 0
            #hosts: []
            origin_regex: false
        paths:
            '^/api/':
                origin_regex: true
                allow_origin: ['*']
                allow_headers: ['X-Custom-Auth','Content-Type','X-Requested-With','Accept','Origin','Access-Control-Request-Method','Access-Control-Request-Headers','Authorization']
                allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
                expose_headers: []
                max_age: 3600
            '^/':
                origin_regex: true
                allow_origin: ['*']
                allow_headers: ['X-Custom-Auth']
                allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
                max_age: 3600
                hosts: ['^api\.']

这工作正常GET但是当我尝试使用时POST我得到

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'http://localhost:8080'。

这个设置有什么问题?

4

1 回答 1

0

我不确定,但是,在您的路径中有^/api/,并且在您的错误消息中只有http://localhost:8080. POST尝试将控制器的路由更改为/api/something. 让我知道它是否有效。


更新:

我不太了解 Nelmio Cors,但是如果您不打算使用复杂的标头管理我建议的方法,在我的情况下是可行的(没有外部捆绑包):

添加监听器:src/AppBundle/Listentes/CorsListener.php

<?php
namespace AppBundle\Listener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class CorsListener
{
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $responseHeaders = $event->getResponse()->headers;

        $responseHeaders->set('Access-Control-Allow-Headers', 'origin, content-type, accept');
        $responseHeaders->set('Access-Control-Allow-Origin', '*');
        $responseHeaders->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, PATCH, OPTIONS');
    }
}

并在服务中注册:app/config/services.yml

services:
    app.cors_listener:
        class:      AppBundle\Listener\CorsListener
        tags:
           - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

我知道这不是您问题的确切答案,但希望它可以提供帮助。

于 2016-12-05T14:16:45.963 回答