go 区分 http 和 https

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" 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容