如何在Golang中设置HTTP请求头Host与URL中的Host不同?
如何在Golang中发送Host头与URL Host不同的HTTP请求
这问题我之前踩过坑!Golang的http包默认会自动用请求URL里的Host值覆盖你手动在Header里设置的Host头,所以直接用req.Header.Set("Host", "aaa.com")是无效的。要实现和你curl命令一样的效果,得换个方式——直接设置请求对象的Host字段。
完整代码示例
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { // 第一步:构造请求,目标URL是bbb.com req, err := http.NewRequest("GET", "http://bbb.com", nil) if err != nil { fmt.Printf("创建请求失败: %v\n", err) return } // 关键操作:直接设置req.Host字段为你想要的Host头值 req.Host = "aaa.com" // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Printf("发送请求失败: %v\n", err) return } defer resp.Body.Close() // 读取响应内容 body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Printf("读取响应失败: %v\n", err) return } fmt.Printf("响应状态码: %s\n", resp.Status) fmt.Printf("响应内容:\n%s\n", string(body)) }
为什么这么做?
Golang的http包在处理请求时,会遵循以下优先级来确定最终的Host头:
- 优先使用
req.Host字段的值 - 如果
req.Host为空,才会使用请求URL中的Host部分
所以直接设置req.Host就能绕过默认的自动覆盖逻辑,实现Host头与目标URL Host不一致的请求,和你这条curl命令的效果完全相同:
curl -H 'Host: aaa.com' 'http://bbb.com'
另外要注意:不要用http.Get、http.Post这类快捷方法,因为它们会自动帮你创建请求对象,没法直接修改Host字段,必须用http.NewRequest手动构造请求后再设置。
内容的提问来源于stack exchange,提问作者lutaoact
相关产品推荐
相关产品推荐

