首页  >  文章  >  后端开发  >  Go中如何确定当前请求URL的Scheme?

Go中如何确定当前请求URL的Scheme?

DDD
DDD原创
2024-11-03 17:35:03798浏览

How to Determine the Scheme of the Current Request URL in Go?

在Go中确定当前请求URL的Scheme

在Ruby/Rack中,可以使用scheme#request检索当前请求URL的scheme。但是,在 Go 中,http.Request.URL.Scheme 返回一个空字符串。要正确获取该方案,您必须考虑以下方法:

服务 HTTP 和 HTTPS 协议需要同时使用具有相同处理程序的 http.ListenAndServe() 和 http.ListenAndServeTLS()。通过仅使用 http.ListenAndServe(),您将专门侦听 HTTP 协议。

HTTPS 是基于 TLS 的 HTTP,在 http.Request 对象中提供 TLS 属性。此属性返回一个 *tls.ConnectionState 对象,其中包含有关请求所使用的 TLS 的信息。

要确定客户端使用的方案,请检查请求的 TLS 属性:

  • 如果 r.TLS 不为 nil,则方案为 HTTPS。
  • 如果 r.TLS 为 nil,则方案为 HTTP。

以下是演示此方法的更新代码示例:

<code class="go">package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // ...
    if r.TLS == nil {
        // the scheme was HTTP
    } else {
        // the scheme was HTTPS
    }
}

func main() {
    http.HandleFunc("/", handler)
    go func() {
        log.Fatal(http.ListenAndServeTLS(":8443", "localhost.crt", "localhost.key", nil))
    }()
    log.Fatal(http.ListenAndServe(":8080", nil))
}</code>

以上是Go中如何确定当前请求URL的Scheme?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn