我用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
答案 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。