带有不同端口映射的Docker Https的.net核心错误重定向

时间:2019-07-19 09:00:56

标签: c# docker ssl https .net-core

我用ssl创建一个.net核心webapi项目。

.ConfigureKestrel((hostingContext, options) =>
                        {
                            var env = hostingContext.HostingEnvironment;
                            if (env.IsProduction())
                            {
                                Console.WriteLine("In Production");
                                options.Listen(IPAddress.Any, 80);
                                options.Listen(IPAddress.Any, 443, listenOptions =>
                                {
                                    listenOptions.UseHttps("./cert.pfx", "password");
                                });
                            }
                        });

并在docker中运行:

docker run -p 80:80 -p 443:443 core

效果很好! Https重定向正确80-> 443

但是,当我更改端口映射时:

docker run -p 5000:80 -p 5001:443 core

Https重定向错误5000-> 443,而不是5001,因此它不起作用,因为主机中没有端口443公开,它仅在docker容器中。

5000(host)->80(docker)--redirect-> 443(host) -X-> 443(docker)

然后,我在Startup.cs中使用以下内容更改AddHttpsRedirection

services.AddHttpsRedirection(options =>
            {
                options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
                options.HttpsPort = 5001;
            });

现在重定向正确,5000-> 5001,我想是因为,重定向是:

5000(host)->80(docker)--redirect->5001(host)->443(docker)

这是正常行为吗?还是任何配置错误/与docker丢失?

我希望当我更改映射-p 5000:80 -p 5001:443时, 是5000-> 5001而不是5000-> 443

1 个答案:

答案 0 :(得分:0)

您似乎已经找到了原因,不确定,但这是正常现象。

  

我希望当我更改映射时-p 5000:80 -p 5001:443是5000-> 5001而不是5000-> 443

当您访问5000(host port)时,docker将使用iptables将流量路由到80(container port),因为重定向是在容器的80 service中进行的,因此浏览器会收到重定向到{ {1}}。

注意:这里,重定向实际上发生在客户端(浏览器或其他)上,因此客户端必须再次连接到主机服务器的443(host port),然后失败。

但是,如果您在容器中更改代码,则发送给客户端的指示将为443 port,那么它将起作用。

还有一些我想你已经知道的东西:

  

-p port1:port2

第一个端口表示主机的端口,第二个端口表示容器的端口,这意味着到主机端口1的所有流量都将路由到容器的端口2。