C# 不同端口映射时.net core与Docker Https错误重定向
我使用ssl创建了一个.net核心webapi项目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())
.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
投票支持更深入的解释重定向概念,并编辑添加我的最终解决方案。参考: