net/http 中的Request 结构有以下结构
// The protocol version for incoming server requests.
// For client requests these fields are ignored. The HTTP
// client code always uses either HTTP/1.1 or HTTP/2.
// See the docs on Transport for details.
Proto string// "HTTP/1.0"
但是实际测试后, 发现不管是 http 还是 https, req.proto 永远是 http/1.1
后来网上又看到一种处理方法
scheme :="http://"
if req.TLS != nil {
scheme ="https://"
}
这个处理方法认为 当是 https 协议时, TLS 不为 nil
实际上,经过我的测试, TLS 也一直为 nil
猜想之后,大概是这个原因:
我们大部分的业务都会用到 nginx , 当http 的请求和 https 的请求经过 nginx 代理转发后,https 被解开了,和 http的请求 就基本上是一致的了,因为 ssl 的验证一般都在 nginx 代理之前就做了。
最后发现一个不那么标准的做法
http 请求头中有一个字段是 X-Forwarded-Proto
X-Forwarded-Proto:记录一个请求一个请求最初从浏览器发出时候,是使用什么协议。当从浏览器中是 http 请求时,这个值是 "http" 如果这个请求是 https 的,那这个值是 "https" 。