Прокси-сервер Docker Nginx — ошибка CORS для POST-запросов в приложении Angular

#asp.net #angular #docker #nginx

#asp.net #angular #docker #nginx

Вопрос:

Я столкнулся с чем-то чрезвычайно странным. У меня есть следующий стек:

  • ASP.Net Базовый API 3.1
  • Интерфейсное приложение Angular 10
  • Прокси-сервер Nginx

Все приложения контейнеризированы, поэтому мой API работает в контейнере docker, мое приложение angular — в контейнере docker (который также использует отдельный веб-сервер nginx для обслуживания SPA) и контейнер nginx, служащий прокси для API.

Ниже приведен типичный запрос GET, который не имеет проблем, и соответствующие заголовки для запроса ПАРАМЕТРОВ: введите описание изображения здесь

введите описание изображения здесь

Итак, запрос GET работает, но когда я пытаюсь использовать POST, запрос параметров выполняется немедленно, за которым следует 400 от nginx вместе с сообщением об ошибке из браузера:

 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://restaurantapi.localhost/chats. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
  

Странная часть приведенного выше сообщения об ошибке заключается в том, что запрос ПАРАМЕТРОВ для POST выполнен успешно:
введите описание изображения здесь

введите описание изображения здесь

Как возможно, чтобы запрос ПАРАМЕТРОВ был успешно возвращен, но сообщение не удалось? Я не совсем понимаю, как это возможно. Я знаю, что его Nginx вызывает эту проблему, потому что я удалил прокси и отправил запрос непосредственно из моего приложения angular в контейнере в API с использованием веб-сервера kestrel (встроенный веб-сервер для .NET core), и это успешно.

Есть ли какая-либо конфигурация, которую я упускаю из виду, вызывая эту проблему? Обратите внимание, что я добавляю заголовки CORS в свой API и не использую CORS через nginx. Я также попытался удалить заголовки ответов из API в Nginx и явно добавить заголовки CORS, но это все равно не удается. Любая помощь по этому вопросу будет оценена.

Моя конфигурация nginx:

 events {
    worker_connections 1024;
}
http {
    underscores_in_headers on;

    upstream api {
        server restaurantapi:5001;
    }
    upstream grpcservice {
        server restaurantapi:5010;
    }

    # redirect all http requests to https
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        return 301 https://$host$request_uri;
    }
    server {
        server_name restaurantapi.localhost;
        listen 443 ssl http2;
        ssl_certificate /etc/certs/resapi.crt;
        ssl_certificate_key /etc/certs/resapi.key;
    
        location /CartCheckoutService/ValidateCartCheckout {
            grpc_pass grpc://grpcservice;
            error_page 502 = /error502grpc;
        }
    
        location = /error502grpc {
            internal;
            default_type application/grpc;
            add_header grpc-status 14;
            add_header grpc-message "Error connecting to gRPC service.";
            return 204;
        }
    
        location / {
            proxy_pass http://api;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Connection keep-alive;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_cache_bypass $http_upgrade;           
        }
    }
    gzip on;
    gzip_vary on;
    gzip_proxied no-cache no-store private expired auth;
    gzip_types text/plain text/css application/json application/xml;
}
  

Журналы из API:

введите описание изображения здесь

Ответ №1:

Проблема заключалась в наличии заголовков websocket (http://nginx.org/en/docs/http/websocket.html ). Я не совсем уверен, что nginx не регистрирует ошибку подключения к вышестоящему серверу, потому что все отображаемые журналы были запросом к nginx.

Удаление заголовков, специфичных для websocket, устранило проблему, с которой я столкнулся. Мне нужно добавить заголовки только для запросов websocket.