背景:近期有个互联网项目,因是面向C端用户,从安全考虑,请求应该是https,从用户体验角度,应让用户输入域名,而不是ip:port,但一般浏览器都是发起HTTP请求,例如,在浏览器输入:www.XXX.cn 完整请求是http://www.XXX.cn , 但这不是我们的最终请求,最终请求是https://www.XXX.cn 。大部分用户能记住域名,让他们记住协议是比较困难的(非IT专业的人几乎不懂协议概念),所以我们需要实现HTTP请求自动重定向到HTTPS请求。
一、Docker部署nginx
Docker部署nginx并配置好ssl证书,可参考:Nginx(Docker 安装的nginx)配置域名SSL证书_nginx配置域名及ssl证书-CSDN博客
二、实现浏览器HTTP请求自动重定向到HTTPS
2.1修改nginx.conf配置
监听两个端口80(HTTP)、443(HTTPS),然后在80 server块里重定向到443,配置如下:
server {
listen 80;
server_name 域名;
方式一:重定向地址
#return 301 https://server_namerequest_uri;
#方式二:(我使用的是这个)
#rewrite ^(.*)$ https://$host$1 permanent;
rewrite ^(.*)$ https://域名$1 permanent;
#方式三:9001是宿主机开放的端口
#error_page 497 https://host:9001request_uri;
}
server {
listen 443 ssl;
server_name 域名;
#https证书
ssl_certificate "xxx.pem";#证书全路径
ssl_certificate_key "xxx.key";#证书全路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
....
}
2.2 修改nginx启动脚本
#这里宿主机开放的端口为:9001(HTTPS),9002(HTTP)
port=9001
port2=9002
docker rm -f 容器名称
docker run -d \
--name 容器名称 \
--ulimit nofile=65535:65535 \
--ulimit nproc=65535:65535 \
-v /home/data/xxx/web/:/home/data/web/ \
-v /home/data/xxx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/data/xxx/nginx_cert/:/etc/nginx/cert/ \
-p $port: 443 \-p $port2: 80 \
-e TZ=Asiz/Shanghai \
--restart=always \
nginx
PS:注意宿主机防火墙需要开放 9001、9002端口
三、验证
在浏览器输入www.XXX.cn(最好用手机浏览器试下,电脑有缓存,会出现误判),看是否能重定向到https请求。出现下图则表示成功