ShadowOfCasper
@ShadowOfCasper
Middle User Interface Web Developer

Как передать статус ошибки через proxy с включенным CORS?

Дано:
Рабочий сервер на 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;
  }
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
Lynn
@Lynn
nginx, js, css
Добавить в add_header флаг always.

https://nginx.org/ru/docs/http/ngx_http_headers_mo...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы