巧用 497 状态码实现同端口 http 跳转 https
/ 2 min read
最近我在研究同一个端口可以有多少种协议共存,恰巧了解到了 OpenResty 或 Nginx 存在一种 497 状态码,意思是客户端使用 HTTP 访问了一个 HTTPS 网站,据此我们可以轻松写出下面的配置:
server { listen 443; server_name example.com; ssl on;
...
# 让 http 请求重定向到 https error_page 497 https://$host$uri?$args;}这里使用了 error_page 指令,可以很方便的捕获某一个状态码并将其直接重定向到我们希望他去到的地方。
说个题外话,80 端口上真的只能跑 HTTP 服务了吗?很显然不是的,端口本身只是一扇门,门牌号写的是 80,但门后站谁完全取决于你——操作系统只负责把到达这个端口的数据包扔给监听它的进程,至于进程怎么解析,那是应用层的事。
所以你可以拿 80 端口干任何你想干的事:比如用 SSH 监听 80,这样就能在防火墙只开放 Web 端口的环境下悄悄连回内网;或者跑一个自定义的二进制协议,甚至可以用自定义的 ALPN 做特殊传输。更有意思的是,现在很多 CDN 和反向代理会用 80 端口同时承载 HTTP/1.1、HTTP/2 和 WebSocket,靠的是 Upgrade 头部和 ALPN 协商,由此可见协议复用可以玩得飞起。
由于某个端口是做什么的已经约定俗成,想要同时复用就需要 “ 技术,更多详情我们以后再聊。
人机验证:请刷新页面以加载评论区