Redirect nginx 301包含内部地址

Redirect nginx 301包含内部地址,redirect,nginx,Redirect,Nginx,我使用两个Docker容器来承载我的应用程序。第一个容器包含nginx侦听端口80。这是我的应用程序的“入口点”,目前它只将所有请求传递给容器2(我的应用程序)。nginx配置如下所示: user www-data; worker_processes 4; events { worker_connections 1024; } http { include mime.types; server { location / {

我使用两个Docker容器来承载我的应用程序。第一个容器包含nginx侦听端口80。这是我的应用程序的“入口点”,目前它只将所有请求传递给容器2(我的应用程序)。nginx配置如下所示:

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,但位置头不正确地包含一个内部地址

例如:如果我转到,则请求首先转到容器1,容器1将其传递到容器2,然后容器2返回301,请求浏览器转到新位置,这是错误的,如下所示:

正确的位置应包含最初询问的主机:

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


为什么nginx使用内部地址重新路由客户端?如何解决此问题?

解决方案是正确设置某些重定向头。我还找到了一个完整的教程:


同时,感谢伊沃·盖洛夫帮助我走向正确的方向。:)

您可以放置
server\u name.example.com在配置的
服务器
部分中。您还可以尝试放置
proxy\u set\u header Host$Host
(也可以尝试在
位置@backend内托管我的应用程序;
部分。并确保您的后端也发送了正确的301重定向。