You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:45:19