Symfony 4.1 - проблема с CORS - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с API Symfony 4.1:

Я использую свой API через ионное приложение, использующее угловой httpclient.

Моя проблема с заголовками CORS, особенно Access-Control-Allow-Methods

У меня были проблемы с CORS, так как мой API и мое приложение не совпадают по происхождению, что привело к установке nelmio/cors-bundle для обработки CORS.

Мой nelmio_cors.yaml выглядит следующим образом:

nelmio_cors:
    paths:
        '^/api/':
            origin_regex: true
            allow_origin: ['*']
            allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
            allow_headers: ['Content-Type', 'Authorization']
            max_age: 3600

На самом деле это работает для всех методов, которые я использовал с тех пор:

  • Опубликовать запросы [OK]
  • Получение запросов [OK]
  • Удалить запросы [OK]

Теперь я хотел добавить маршрут PATCH в мой API. Я тестирую контроллер с Почтальоном, и я работаю как шарм Теперь, когда я запрашиваю тот же маршрут из моего углового сервиса:

        return this.http.patch(this.url + '/api/users/' + userId,
                               dataToPatch, 
                               this.authHeaders)
                        .map(response => response.json());

Консоль регистрирует следующее:

Failed to load http://symfony.local/api/users/1: Method PATCH is not allowed by Access-Control-Allow-Methods in preflight response.

Здесь вы можете увидеть заголовки ответа на запрос:

Access-Control-Allow-Headers: authorization,content-type
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 3600
Allow: POST, GET, OPTIONS, PUT, DELETE
Cache-Control: no-cache, private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Tue, 06 Nov 2018 14:02:51 GMT
Server: nginx
Transfer-Encoding: chunked
X-Powered-By: PHP/7.2.11

Как вы можете видеть, и если я правильно понимаю заголовки CORS, методы PATCH недопустимы, но почему это работает при использовании postman для использования API.

Я также установил расширение Allow-Control-Allow-Origin:* в Chrome, но там тоже не получилось ...

Я использую https://github.com/ikamikaz3/docker-symfony как мой стек, откуда он может прийти? (где-то может быть неправильная конфигурация?)

Я могу предоставить больше кода, если потребуется, но мне кажется, что это глупая ошибка ...

РЕДАКТИРОВАТЬ 1:

После удаления Allow-Control-Allow-Origin:* из Chrome я получаю следующее при входе в систему

Failed to load http://symfony.local/login_check: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'null' that is not equal to the supplied origin. Origin 'http://localhost:8100' is therefore not allowed access.

РЕДАКТИРОВАТЬ 2:

После обновления моего symfony.conf с помощью следующего в моем контейнере nginx мне удалось заставить работать API, PATCH все еще не работает, но я думаю, что могу это сделать <3 </p>

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            #
            # Custom headers and headers various browsers *should* be OK with but aren't
            #
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
            #
            # Tell client that this pre-flight info is valid for 20 days
            #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
    if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
    }
    if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
    }

1 Ответ

0 голосов
/ 07 ноября 2018

Мне удалось заставить это работать, вот как я сделал это для справки:

  1. Удалите nelmio / cors-bundle (поскольку мы обрабатываем CORS напрямую с NGINX), потому что это вызвало конфликты, такие как поле заголовка 2 Allow-Control-Allow-Origin.

  2. Добавьте методы, которые я хочу, в nginx.conf (с остальной частью конфигурации, как в моем оригинальном сообщении)

    if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Methods' 'HTTP_VERBS, SEPARATED, WITH, COMMAS';

  3. Перестройте мой стек докера docker-compose build

  4. Разверните его docker-compose up -d
  5. Наслаждайтесь поддержкой CORS

Вы можете найти мой форк docker-symfony от maxpou для более подробной информации (файлы конфигурации и т. Д.) В http://github.com/ikamikaz3/docker-symfony который содержит гибкий стек Symfony с ELK / Kibana, PhpMyAdmin (WIP), а теперь NGINX с поддержкой CORS !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...