Nginx Cors设置在Docker容器中不起作用

时间:2019-02-21 19:55:29

标签: angularjs docker nginx nginx-location nginx-reverse-proxy

我正在尝试通过docker compose在Linux服务器上部署前端(角度)和后端(.net核心)。我已经在相应文件中创建了两个docker文件。这是我的 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)。但是当我尝试登录时,它向运行在端口5000上的api服务发送了一个ajax请求,并且我遇到了跨源错误,因为我的前端运行在端口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'

;

1 个答案:

答案 0 :(得分:0)

尝试将以下内容添加到nginx配置中,以便将所有/api/login请求转发到http://api:5000/

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

您还可以使用rewrite使nginx调用没有/api/login前缀的API服务器。

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

CORS标头可能不起作用,因为nginx正在返回它们,但是您需要API服务器才能返回它们。