Ошибки CORS с Symfony 4 & Nelmio CORS Bundle - PullRequest
0 голосов
/ 02 февраля 2019

Я пытался выяснить, почему у меня возникают проблемы с CORS с моим приложением API Symfony 4, которое я только что развернул на своем сервере Apache и не могу разобраться в этой проблеме.

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, и я получаю стандартную ошибку;

Доступ к XMLHttpRequest по адресу http://my -api.com / foo 'from origin' http://localhost:4200' заблокировано политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Никаких специальных заголовков не отправляется, и на данный момент я установил для регулярного выражения разрешенного источника значение "all", поэтому я не могу понять, что является причиной проблемы здесь.Я даже проверил в кэше, чтобы убедиться, что источник правильно извлекается из переменных env, что и есть.Если вам нужен другой контекст / содержимое файла, сообщите мне!

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Я решил проблему, и хотя на первый взгляд она была связана с конфигурацией CORS, на самом деле это была неверная конфигурация проекта на сервере.

TL; DR означает, что в проекте отсутствовал файл .htaccess, который мне не требовался при разработке из-за использования Valet - следуя инструкциям здесь , проблема решена.

0 голосов
/ 08 февраля 2019

Я всегда стараюсь быть немного более конкретным, чтобы разрешить CORS, например:

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

, что вы можете попробовать, если вы действительно хотите включить все источники, что-то вроде:

CORS_ALLOW_ORIGIN=^.*$
0 голосов
/ 12 февраля 2019

Ваша проблема в том, что вы решили использовать регулярное выражение (origin_regex: true), но не указали допустимый шаблон.

Если вы хотите использовать origin_regex: true, вам следует указать правильный шаблон, такой как.* или ^.*$.

Если вы не хотите использовать регулярное выражение, пропустите параметр origin_regex (или установите его на false) и просто используйте * в качестве CORS_ALLOW_ORIGIN значение.

0 голосов
/ 02 февраля 2019

Зачем вам нужен 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', '*');
    }
}

Зарегистрируйте его как ядро.event_subscriber

    app.http_kernel.cors_subscriber:
        class: App\EventListener\HttpKernel\CorsSubscriber
        tags:
            - { name: kernel.event_subscriber }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...