nginx не доставляет ошибки на фронт

Рейтинг: 0Ответов: 1Опубликовано: 08.04.2023

Все уже из гуглил что мог, что кроме как этот пост пока вариантов нет как решить сей вопрос) Имеем nginx вот с такими настройками

worker_processes 1;
events { worker_connections 1024; }

http {
    sendfile on;
    upstream app_servers {
        server 14.144.144.144:8000;
    }

    server {
        listen 8080;
        server_name _;

        location / {
            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            proxy_set_header   Accept-Encoding "";
            add_header 'Access-Control-Expose-Headers' 'Content-Disposition';
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range, content-disposition, authorization';
            if ($request_method = 'OPTIONS') {
                return 204;
            }
        }
    }

    server {
        gzip on;
        gzip_types text/html, text/plain, application/json, application/javascript, text/css text/javascript application/x-javascript;
        gzip_vary on;

        listen 80;
        server_name _;
        server_tokens off;

        root /usr/share/nginx/html;
        index index.html;

        location / {
            include mime.types;
            try_files $uri $uri/ /index.html;
        }
    }
}

Статика раздается с 80 порта, запросы отправляются с помощью axios на nginx и он уже проксирует всю эту историю на сервер с 8000 портом.

Вот если что настройки axios

export const BASE_URL = "http://14.144.144.144:8080"

export const $API = axios.create({
  baseURL: BASE_URL + "/api/v1",
  headers: {
    "Content-Type": "application/json",
    accept: "application/json",
  }
})

Проблема заключается в том, что когда я отправляю запрос, который завершается успехом, то мне все приходит в полном порядке. Например как: Успешный запрос

Но когда запрос завершается с ошибкой, то вместо того что я вижу в swagger и postman

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "indicatorId": "123456789",
  "error": "ERROR MESSAGE"
    "$.data.id": [
      "The JSON value could not be converted to ..."
    ]
  }
}

Я получаю ошибки с CORS

Access to XMLHttpRequest at 'http://14.144.144.144:8080/api/v1/indicators/shuffle' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
GET http://14.144.144.144:8080/api/v1/indicators/shuffle net::ERR_FAILED 400 (Bad Request)

И вместо содержательного ответа, где будет статус и ошибки, мне в catch падает вот это:

Не успешный запрос

И собственно мой главный вопрос заключается в том куда девается error и status, почему возникают CORS при неуспешном запросе и как это все настроить так, чтобы nginx все таки мне возвращал нормальный ответ, который и задуман сервером. Заранее спасибо :)

Ответы

▲ 2

Собственно проблема заключалась в том, что по дефолту nginx добавляет заголовки только к успешным запросам (код 2**). Чтобы он добавлял их ко всем запросам, надо добавить ключевое слово always в таком виде

    add_header 'Access-Control-Expose-Headers' 'Content-Disposition' always;
    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept' always;