我在docker容器中有一个Nginx,我想对所有请求强制使用SSL。因为我需要将Web服务器端口暴露在容器外部的其他端口中,所以在访问服务器时我没有使用标准端口。
我将容器内的SSL端口443映射到外部的8888,因此当我写URL https://myserver:8888时,HTTPS正常工作。
当我不使用https前缀时会发生什么?端口443仍在侦听,但是由于我未使用https模式,因此出现以下错误:
400 Bad Request
The plain HTTP request was sent to HTTPS port
如果我将请求重定向到端口80到443是不够的,因为因为我是通过端口8888来指定的,所以所有请求都是通过端口443传入的,但是我不能保证所使用的模式是HTTP。
我的意思是,以下代码块无效,因为我没有将端口80暴露在外部,只有8888直接映射到443
server {
server_name myserver;
listen 80;
return 301 https://$host:$server_port$request_uri;
}
即使用户将http放在URL上,我如何强制其工作?
谢谢
答案 0 :(得分:1)
您必须使用两个不同的端口:例如8888和8889。
将第一个端口绑定到容器的80,将第二个端口绑定到443。
如果客户要通过http与您的容器联系,则必须使用8888(-> 80)。如果虚拟主机配置正确,nginx将向301端口或302 HTTP返回代码(重定向)提供到https端口(8889-> 443)。
所以您的退货可能看起来像
return 301 https://$host:8889$request_uri;
客户端将在正确的端口上启动TLS连接。
由于技术限制,很难将同一端口用于清晰的流量和TLS加密端口,因此大多数Web服务器将侦听两个不同的端口:80用于纯文本,443用于TLS。