开发golang http应用程序时,我经常使用http.Request。访问请求主机地址时,我会使用req.Host,但是我发现有req.URL.Host字段,但是当我打印它时,它是空的。
http.Request
req.Host
req.URL.Host
func handler(w http.ResponseWriter, r *http.Request) { fmt.Println("uri Host: " + r.URL.Host + " Scheme: " + r.URL.Scheme) fmt.Println("Host: " + r.Host) }
http.Request的文档提供了以下注释,但net/url并没有提供太多线索。
net/url
// For server requests Host specifies the host on which the // URL is sought. Per RFC 2616, this is either the value of // the "Host" header or the host name given in the URL itself. // It may be of the form "host:port". For international domain // names, Host may be in Punycode or Unicode form. Use // golang.org/x/net/idna to convert it to either format if // needed. // // For client requests Host optionally overrides the Host // header to send. If empty, the Request.Write method uses // the value of URL.Host. Host may contain an international // domain name. Host string
在我看来,请求中有两个主机值:uri行和Host标头,例如:
Host
GET http://localhost:8080/ HTTP/1.1 Host: localhost:8080
但这并没有解决很多问题,它会带来很多问题:
带有真实HTTP请求示例的答案是最好的。提前致谢。
该r.URL字段是通过解析HTTP请求URI创建的。
r.URL
该r.Host字段是主机请求标头的值。它与call的值相同r.Header.Get("Host")。
r.Host
r.Header.Get("Host")
如果网上的HTTP请求是:
GET /pub/WWW/TheProject.html HTTP/1.1 Host: www.example.org:8080
然后r.URL.Host是“”和r.Host是www.example.org:8080。
r.URL.Host
www.example.org:8080
的价值r.URL.Host与r.Host几乎都是不同的。在代理服务器上,r.URL.Host是目标服务器r.Host的主机,也是代理服务器本身的主机。当不通过代理连接时,客户端不会在请求URI中指定主机。在这种情况下,r.URL.Host是空字符串。
如果您未实现代理,则应使用r.Host确定主机。