У меня проблемы с 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';
}