golang中判断请求是http还是https获取当前访问地址

 更新时间:2023年10月07日 16:19:33   作者:雪狼骑兵  
这篇文章主要为大家介绍了golang中判断请求是http还是https获取当前访问地址示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

在线客服系统的开发日志

今天给客服系统增加了一项配置,配置企业微信内部群通知机器人 webhook,当有新消息到来的时候,调用 webhook,推送给企业微信群。新消息的内容里,支持 markdown,可以带链接,就想把当前网址的链接带过去,方便直接点击后去回复消息。下面是涉及的技术知识点总结。

未使用 nginx 等反向代理的情况下

那么可以直接使用下面的代码来确认,http.Request 结构体的 TLS 字段判断请求是否使用了 HTTPS 协议。如果该字段不为 nil,则说明请求使用了 HTTPS 协议;否则,说明请求使用了 HTTP 协议

package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
    if r.TLS != nil {
        fmt.Println("HTTPS request")
    } else {
        fmt.Println("HTTP request")
    }
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

经过反向代理的情况下

上面的代码失效,可以使用下面方法
如果使用了 nginx 反向代理,那么需要确保反代中传入了下面的 headers 参数 X-Forwarded-Proto

location / {
    proxy_pass http://your_upstream_server;
    proxy_set_header X-Forwarded-Proto $scheme;
}

可以判断这个 header 来确认是否 https

package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
    proto := r.Header.Get("X-Forwarded-Proto")
    if proto == "https" {
        fmt.Println("HTTPS request")
    } else {
        fmt.Println("HTTP request")
    }
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

综合一下,获取当前访问地址的函数

//获取当前访问的Host
func GetHost(r *http.Request) (Url string) {
    scheme := "http://"
    if r.TLS != nil || r.Header.Get("X-Forwarded-Proto") == "https" {
        scheme = "https://"
    }
    return strings.Join([]string{scheme, r.Host}, "")
}

另外,有客服系统需求的同学,可以访问下面地址研究测试
gofly.v1kf.com

以上就是golang中判断请求是http还是https获取当前访问地址的详细内容,更多关于golang判断请求访问地址的资料请关注脚本之家其它相关文章!

相关文章

  • GoLang sync.Pool简介与用法

    GoLang sync.Pool简介与用法

    这篇文章主要介绍了GoLang sync.Pool简介与用法,Pool是可伸缩、并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象重用机制,缓解GC压力,提高程序性能
    2023-01-01
  • Golang中对json的优雅处理方式

    Golang中对json的优雅处理方式

    这篇文章主要给大家介绍了关于Golang中对json的优雅处理方式,解析JSON在golang中很麻烦,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • GoLang函数与面向接口编程全面分析讲解

    GoLang函数与面向接口编程全面分析讲解

    这篇文章主要介绍了GoLang函数与面向接口编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Go指针的具体使用

    Go指针的具体使用

    本文主要介绍了Go指针的具体使用,包括使用指针、空指针、指针数组、指向指针的指针等,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • win10下go mod配置方式

    win10下go mod配置方式

    这篇文章主要介绍了win10下go mod配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang 实现对Map进行键值自定义排序

    golang 实现对Map进行键值自定义排序

    这篇文章主要介绍了golang 实现对Map进行键值自定义排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • victoriaMetrics库布隆过滤器初始化及使用详解

    victoriaMetrics库布隆过滤器初始化及使用详解

    这篇文章主要为大家介绍了victoriaMetrics库布隆过滤器初始化及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 关于Go 空结构体的 3 种使用场景

    关于Go 空结构体的 3 种使用场景

    在今天这篇文章要给大家介绍得是Go 语言中几种常见类型的宽度,并且基于开头的问题 ”空结构体“ 进行了剖析,需要的朋友可以参考一下,希望对你有所帮助
    2021-10-10
  • golang版本升级的简单实现步骤

    golang版本升级的简单实现步骤

    个人感觉Go在众多高级语言中,是在各方面都比较高效的,下面这篇文章主要给大家介绍了关于golang版本升级的简单实现步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • go语言中for range使用方法及避坑指南

    go语言中for range使用方法及避坑指南

    Go中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面这篇文章主要给大家介绍了关于go语言中for range使用方法及避坑指南的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论