Go程序无法读取Host Header问题求助
解决代理程序中Host Header缺失的问题
问题背景
实现HTTP代理功能时,发现通过http.ReadRequest读取到的请求中,request.Header里始终没有Host字段——哪怕用curl测试时明明发送了Host头,手动指定Host头也没用,调试打印Headers只能看到Accept、User-Agent等字段。
原因分析
Go标准库的http.ReadRequest会对Host头做特殊处理:按照HTTP/1.1规范,Host是请求的必填核心字段,因此标准库会直接把Host头从Header集合中提取出来,单独存到request.Host属性里,不会在request.Header中保留它。
解决方案
直接通过request.Host获取Host信息,而非从request.Header中读取。同时,你的代理拨号逻辑也需要调整——原代码中用request.URL.Host作为目标地址,但如果请求是直接发往代理(比如curl localhost:8080),request.URL.Host会是空值,这时候应该用request.Host来连接目标服务器。
修改后的代码示例:
request, err := http.ReadRequest(bufio.NewReader(conn)) if err != nil { log.Println("Error reading request", err) return } // 使用request.Host作为目标连接地址 target, err := net.Dial("tcp", request.Host) if err != nil { log.Println(request.Host) log.Println("Error reaching target", err) } defer target.Close()
验证方法
调试时直接打印request.Host,就能看到curl发送的Host值(比如localhost:3000)。
内容的提问来源于stack exchange,提问作者badman
相关产品推荐
相关产品推荐

