Настройка nginx cors не работает в контейнере докеров

Я пытаюсь развернуть интерфейс (angular) и бэкэнд (ядро .net) через docker compose на сервере Linux. Я создал два файла докеров, представленных в соответствующем файле. Вот мой файл docker.compos.yml.

version: '3.4 
  volumes: 
   data:

services:
  api:
    build:
      context: .
      dockerfile: Backend/Dockerfile
    ports:
      - "5000:80"
    depends_on:
      - db
  web:
    build:
      context: .
      dockerfile: Frontend/Dockerfile
    ports:
     - "80:80"
    depends_on:
      - api
  db:
    image: postgres:latest
    volumes: 
     - data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "docker_Password"
      POSTGRES_DB: "database_name"
    ports:
      - "5432:5432"

Я использую образ nginx для обслуживания сборки интерфейса. Вот файл default.conf с базовыми настройками.

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }
}

С приведенной выше конфигурацией я запустил docker-compose up --build, и я могу увидеть свою страницу входа (поскольку порт 80 открыт, поэтому мой URL-адрес - это мой IP-адрес сервера). Но когда я пытаюсь войти в систему, он отправляет запрос ajax в мою службу api, которая работает на порту 5000, и я получил ошибку перекрестного происхождения, поскольку мой интерфейс, работающий на порту 80, пытается получить доступ к службе, которая работает на порту 5000. Я хотел сделать что-то, чтобы все мои запросы, начинающиеся с пути api (здесь в моем случае это {server_ip} / api / login), перенаправляли на службу api. Есть ли в nginx что-нибудь, что может помочь при перенаправлении запроса?

Я также попытался добавить следующие строки в блок местоположения default.conf, но безуспешно.

add_header 'Access-Control-Allow-Origin' '*';

add_header 'Access-Control-Allow-Methods' GET, POST, OPTIONS '

;


person Junaid Zubair    schedule 21.02.2019    source источник


Ответы (1)


Попробуйте добавить следующее в конфигурацию nginx, чтобы он перенаправлял все /api/login запросы на http://api:5000/.

location /api/login {
  proxy_pass http://api:5000;
}

Вы также можете использовать rewrite, чтобы заставить nginx вызывать ваш сервер API без префикса /api/login .

location /api/login {
  rewrite ^/api/login/(.*) /$1 break;
  proxy_pass http://api:5000;
}

Заголовки CORS, вероятно, не работали, потому что nginx возвращал их, но вам нужен был ваш сервер API, чтобы возвращать их.

person kichik    schedule 21.02.2019
comment
@kichick, попробовал вышеуказанное решение, но оно не сработало. У меня такая же ошибка, как и раньше. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource - person Junaid Zubair; 22.02.2019
comment
Вы также обновили свой JavaScript для доступа к /api/login через порт 80? Он должен использовать CORS, если он находится в одном и том же источнике. - person kichik; 22.02.2019
comment
Сегодня починил. Я удалил порт (в данном случае 5000) из конфигурации прокси-сервера nginx. Спасибо @kichik - person Junaid Zubair; 27.02.2019