go - Go 忽略 HTTP_PROXY 环境变量
问题描述
我在整个互联网上阅读,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 第 118 行和第 181 行是确切if
的原因。
问题是,HTTP_PROXY
当请求具有 URL localhost或127.xxx时,它会被忽略。但是您可以轻松地将自定义 URI 添加到/etc/hosts
或C:\Windows\System32\drivers\etc\hosts
.
127.0.0.1 localserver.loc
然后所有请求都必须转到localserver.loc:8090
not localhost:8090
。它会像魅力一样发挥作用。
推荐阅读
- unix - grep 用于文件中的部分字符串
- firebase - 如果没有数据 Flutter Stream,Firestore .where 永远不会返回结果
- sql - 创建具有 2 个主键和两个外键的表,这些表引用 2 个具有相同约束名称的不同表
- ios - ITMS-90424:无效的 Swift 支持 - SwiftSupport 文件夹为空。使用 Xcode 的当前公共 (GM) 版本重新构建您的应用程序并重新提交
- javascript - nodejs中聊天,消息根据聊天中当前用户数重复
- apache-kafka - Kafka:消费者 api:如果在组中运行,回归测试失败(按顺序)
- html-table - 如何在使用 css 选择器抓取表格时过滤掉转义序列?
- nginx - Kubernetes 共享非空卷
- ruby-on-rails - Rails PostgreSQL 检查列是否是虚拟的
- ios - 如何在 iOS 13 Swift 中完全隐藏标题栏而不是导航栏