Как исправить ошибку при настройке CORS в NGINX?
У меня есть свой небольшой сервис. Вот часть его nginx конфигурации:
location /main {
add_header 'Host' '$host:8080';
proxy_pass http://backend_upstream
}
Как-то пришел пользователь с ошибкой ниже:
Access to XMLHttpRequest at 'https://server.ru/main' from origin 'https://first-origin.ru' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
curl 'https://server.ru/main' \
-H 'sec-ch-ua: "...", "..."' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'origin: https://first-origin.ru' \
-H 'Referer: https://referer.ru/' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-site: same-site' \
-H 'User-Agent: ...' \
-H 'accept-language: ...' \
-H 'accept: application/json, text/plain, */*' \
-H 'priority: u=1, i' \
-H 'Content-Type: application/json' \
--data-raw '{"streets":"some","count":2}'
Я поправил конфигурацию, добавив корс заголовки:
location /main {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Host' '$host:8080';
add_header 'Access-Control-Max-Age' 600;
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Host' '$host:8080';
add_header 'Access-Control-Max-Age' 600;
}
proxy_pass http://backend_upstream
}
Но в таком случае пришел другой пользователь с другой ошибкой. Пытаюсь понять работу корс, но не понимаю, что не так и почему ошибка сразу в обоих случаях - когда заголовки есть в конфигурации и когда их нет.
Ошибка второго пользователя и его запрос:
Access to fetch at 'https://server.ru/main' from origin 'https://origin.ru' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
curl 'https://server.ru/main' \
-H 'sec-ch-ua: "...", "..."' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'Referer: https://origin.ru/' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'User-Agent: ...' \
-H 'Content-Type: application/json' \
--data-raw '{"streets":"all","count":1}' \
--compressed
В то же время, если я делаю те же запросы, у меня всё отлично работает. Можете подсказать, что еще можно проверить?