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

如何在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头:

  1. 优先使用req.Host字段的值
  2. 如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:40