Go 忽略 HTTP_PROXY 环境变量

标签 go environment-variables

我在整个互联网上看到,Go 读取 HTTP_PROXY 环境变量并为默认客户端设置代理。但是,它对我不起作用,我不知道为什么。

我在 Ubuntu 20.04 上,Go 是 1.16,所以我升级到 1.17,但还是一样。

我有下面的程序,我在终端中执行:HTTP_PROXY="http://localhost:8000"go run req.go 我看到第一个 Println 打印出正确的值,但未使用代理。

func main() {
    fmt.Println(os.Getenv("HTTP_PROXY"))
    client := &http.Client{}
    resp, err := client.Get("http://localhost:8090/vm/1")
    if err != nil {
        log.Fatal(err)
    }
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(body))
}

如果我修改代码并明确设置代理,它就可以工作。

u, err := url.Parse("http://localhost:8000")
if err != nil {
    log.Fatal(err)
}
client := &http.Client{
    Transport: &http.Transport{Proxy: http.ProxyURL(u)},
}

最佳答案

在深入研究源代码后,我找到了主要原因和解决方法。这是评论行为,但相当深刻。来源opensource.google/x/net/http/httpproxy/proxy.go line 118line 181是负责的确切 if

问题是,当请求具有 URL localhost127.x.x.x 时,HTTP_PROXY 会被忽略。但是您可以轻松地将自定义 URI 添加到 /etc/hostsC:\Windows\System32\drivers\etc\hosts

127.0.0.1    localserver.loc

然后所有请求都必须转到 localserver.loc:8090 而不是 localhost:8090。它会像魅力一样发挥作用。

关于Go 忽略 HTTP_PROXY 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69789948/

相关文章:

unit-testing - 在 Golang 中测试文件系统的示例代码

mysql - 为什么连接到 Google Cloud SQL 在 Docker 容器内失败但在 Docker 容器外成功?

Java - 启动时读出系统环境

golang 初始化一片空接口(interface)

docker - 如何启动 docker 容器并通过 golang 脚本运行一些命令?

go - 更改结构内部结构的引用

static - 在 Rust 中运行时使用环境变量填充静态/常量

elasticsearch无法解析elasticsearch.yml中的环境变量

ubuntu - 如何使用终端在 Ubuntu 19.04 中更改环境变量

scripting - 如何使用 JScript (WSH) 将 HKCU\Environment 中的注册表项列表打印到 SDTOUT?