0x1 场景
在 nginx 中一个监听端口只能有一种状态,如果监听了 http,那么不能再次监听 https,所以会出现一种需求: 如果环境使用了非标准的 https 端口,而用户如果没有手动输入前缀 https:// ,那么是无法正常访问环境的,通常返回的是 400,告诉用户在 https 上使用了 http 协议。但这样仍然不够,对于不熟悉技术的用户来说,也仍然不知道需要去手动处理前缀
0x2 常用解决办法
通常这问题有一个常用的解决办法。那就是增加一个 http 端口,在这个端口上做 301 跳转到 https即可。那这样就用到了两个端口,我们可以通过一个端口来解决问题吗? 答案是可以的
0x3 一个端口497
参考如下的配置:
error_page 497 https://$http_host$request_uri;
error_page 指令也是我们常用的,就是把指定的错误响应状态码跳转到设定的页面上,所以这一句基本的含义就是把 497 的状态码跳转到其 https 地址上。再结合其能解决问题,我们可以知道,当 nginx为https环境时,如果接受到了 http 请求,那么其会响应 497。至此我们就解决了单个端口实现 https 环境,并且兼容 http 访问跳转的需求。
0x4 haproxy实现
发现 haproxy 也是有办法可以实现的,参考文档:
https://discourse.haproxy.org/t/one-port-to-catch-http-and-https-requests-and-redirect-to-the-https-version/1703?u=elovin
评论