尝试代理一个请求,我发现接收到的标头中不存在主机标头
更新:正如其中一个答案所指出的,我可能需要主机字段,这也不会改变,主机头仍然不存在。
代码:
request, err := http.ReadRequest(bufio.NewReader(conn))
if err != nil {
log.Println("Error reading request", err)
return
}
target, err := net.Dial("tcp", request.URL.Host)
if err != nil {
log.Println(host)
log.Println("Error reaching target", err)
}
defer target.Close()
旋度命令
curl -v localhost:8080
输出:
Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.79.1
> Accept: */*
>
所以主机头出现在curl中。
在程序中添加了一个调试步骤以打印标题
fmt.Println("Headers:")
for key, values := range request.Header {
fmt.Printf("%s: %v\n", key, values)
}
程序输出:
Headers:
Accept: [*/*]
User-Agent: [curl/7.79.1]
仍不存在主机标头
现在,我尝试使用curl传递主机头:
curl -v -H 'Host: localhost:3000' localhost:8080
相同的输出,标题出现在curl中,但不在程序中
1条答案
按热度按时间wvt8vs2t1#
您需要的是
Request
类型的Host
字段。//对于服务器请求,Host指定在其上执行
//查找URL。对于HTTP/1(根据RFC 7230第5.4节),
//是“Host”标头的值或主机名
//在URL本身中给定。对于HTTP/2,它是
//“:authority”伪头字段。
//格式可以是“host:port”。对于国际域
//名称,主机可以是Punycode或Unicode格式。使用
golang.org/x/net/idna将其转换为任一格式,如果
//需要。
//若要防止DNS重新绑定攻击,服务器处理程序应该
//验证Host标头是否具有一个值,对于该值,
//处理程序认为自己具有权威性。
// ServeMux支持注册到特定主机的模式
//命名并保护其注册的处理程序。
// //对于客户端请求,Host可选择覆盖Host
//标头。如果为空,则Request.Write方法使用
//URL.Host的值。Host可以包含国际
//域名。
主机字符串