Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nginx 对一个端口同时支持 http 和 https

  浏览器默认对 http 和 https 使用不同的端口,所以一般省略端口的 Web 服务器可以在 80 和 443 上分别开服务。但有些基于端口的 Web 服务怎么办呢?如果开多个端口,用户可能需要自己去记住端口对应的 scheme。为什么不试试把 http 和 https 都在同一个端口上实现呢?
  TLS 也是基于 TCP,当服务器建立 TCP 连接后,可以根据收到的第一份数据来判断到底客户端是希望建立 TLS 还是直接就发了一个 http 请求过来。nginx 就做了这件事(代码),它会判断 TCP 请求建立后接收到的首个字节是什么。如果是 0x80 或 0x16 就可能是 SSL 或 TLS,可以尝试进行 https 握手。而且如果端口开启了 https,但请求过来的并不是,则会抛出一个 http 级别的错误(代码)。注意他的状态码是 NGX_HTTP_TO_HTTPS 找找这个宏的定义会发现是 497,然后在 special response 的处理中会抛出一个 400 错误(因为 497 并不是标准的状态码,丢给浏览器也没用)。所以浏览器用 http 访问开启了 https 的端口会得到一个这样的错误页面:

  既然我们知道 nginx 内部的状态码是 497,那么我们就可以使用 error_page 指令将 479 状态码重定向,它就可以恢复 200,再次进入路由处理。比如: error_page 497 = @497; location @497 { rewrite / $uri last; }
  还有一种玩法是将 error_page 497 重定向到 https,这样即使用户错误地使用 http 来访问你的服务也可以让浏览器自动切换到正确的方式。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^