Дано:
Рабочий сервер на Rust с тремя endpoint на абстрактном порту (допустим 3333)
Nginx Proxy, который абстрактный домен и ссылает эти три точки на rust сервер через proxy pass.
Фронт-енд на localhost и других тестовых поддоменах.
Конфигурация cors установлена в nginx, поскольку фронт-енд смотрит именно туда, а nginx уже в свою очередь обращается в rust сервер на той же машине через ip (proxy_pass 127.0.0.1:3333) На стороне раста настроек cors не стоит.
Проблема:
В случае успешных кейсов всё работает хорошо. Но если рабочий сервер сбоит (отправляет 5xx или 4xx), то front-end не может получить ошибку. Пробовал axios - получаю network error и в response нет никаких статускодов. Пробовал fetch - то же самое. failed to fetch.
Мысли - preflight (options) запрос падает - отдаёт то же что и get / post - оттого и fetch / axios не воспроизводят последующий запрос. Но вот тогда вопрос - почему options падает, если в конфиге nginx стоит условие в случае options вернуть 204.
Как победить корс и получить долгожданную 4xx, 5xx ошибку от раста?
location /endpoint {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-forward-for $proxy_add_x_forwarded_for;
proxy_pass http://<ip>:3333;
}