2016-09-17 67 views
0

我使用两个Docker容器来托管我的应用程序。第一个容器包含nginx监听端口80.这是我的应用程序的“入口点”,目前它只将所有请求传递给容器2(my-app)。 nginx的配置如下:nginx 301包含内部地址

user www-data; 
worker_processes 4; 

events { 
     worker_connections 1024; 
} 

http { 
    include mime.types; 

    server { 
     location/{ 
      proxy_pass http://my-app:80; 
     } 
    } 
} 

第二容器的nginx的配置是这样的:

user www-data; 
worker_processes 4; 

events { 
     worker_connections 1024; 
} 

http { 
    include mime.types; 

    server { 

     root /var/www/my-app/public; 

     location =/{ 
      proxy_pass http://localhost:81; 
     } 

     location/{ 
      try_files $uri $uri/ /index.html @backend; 
     } 

     location @backend { 
      proxy_pass http://localhost:81; 
     } 
} 

}

的问题是:当nginx的希望自动重新路由客户端一个新的地址,它正确返回301,但位置标头错误地包含一个内部地址。

例如:如果我去http://localhost:80/my-folder,请求第一进入容器1,它传递给容器2,然后返回301要求浏览器去到新的位置,其是不正确地执行以下操作: http://my-app/my-folder/

正确的位置应该包含最初问主持人:http://localhost/my-folder/

当然,在生产和,地址example.com/my-folder应该被转发到example.com/my-folder/,而不是我的-app/my-folder/

为什么nginx使用内部地址重新路由客户端?我怎么解决这个问题?

+0

您可以将'server_name .example.com;'放置在您的配置的“服务器”部分内。您也可以尝试在'location @backend;'部分放置'proxy_set_header Host $ host;'(也尝试'Host my-app;')。并确保您的后端也发送正确的301重定向。 –

回答