Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同端口映射时.net core与Docker Https错误重定向_C#_Docker_Ssl_Https_.net Core - Fatal编程技术网

C# 不同端口映射时.net core与Docker Https错误重定向

C# 不同端口映射时.net core与Docker Https错误重定向,c#,docker,ssl,https,.net-core,C#,Docker,Ssl,Https,.net Core,我使用ssl创建了一个.net核心webapi项目 .ConfigureKestrel((hostingContext, options) => { var env = hostingContext.HostingEnvironment; if (env.IsProduction())

我使用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(主机)->80(docker)--重定向->443(主机)-X->443(docker)

然后,我将Startup.cs中的AddHttpsRedirection更改为

services.AddHttpsRedirection(options =>
            {
                options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
                options.HttpsPort = 5001;
            });
现在它重定向正确,5000->5001,我想这是因为,重定向是:

5000(主机)->80(docker)--重定向->5001(主机)->443(docker)

这是正常的行为吗?或者docker的任何配置错误/缺失

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

5000->5001不是5000->443吗?看起来你已经找到了原因,不确定,但这是正常的行为

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

当您访问
5000(主机端口)
时,docker将使用iptables将流量路由到
80(容器端口)
,因为重定向是在您容器的
80服务中设计的,所以浏览器会收到重定向到
443(主机端口)
的指示

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

但如果您更改容器中的代码,则发送到客户端的指示将是
Hi,client,请重定向到5001端口,然后它将工作

另外,我想你已经知道了:

-端口1:端口2

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

使用docker更新.Net Core

对于具有docker配置的.net core,如下所示可以处理此情况:

docker run
-p 5000:80 \
-p 5001:443 \
-e ASPNETCORE_HTTPS_PORT=5001 \
-e ASPNETCORE_URLS=https://+;http://+ \
-e Kestrel__Certificates__Default__Path=/path/to/certificate.pfx \
-e Kestrel__Certificates__Default__Password=password

投票支持更深入的解释重定向概念,并编辑添加我的最终解决方案。参考: