http - 反向代理零指针
问题描述
我正在尝试在 golang 中编写一个重复使用代理的反向代理,但由于我看不到的原因,我得到了一个 nil 指针。
type Configuration struct {
Proxies map[string]Proxy `mapstructure:"proxies"`
Port int `mapstructure:"port"`
}
type Proxy struct {
Upstream string `mapstructure:"upstream"`
SkipVerify bool `mapstructure:"tls-skip-verify"`
HostProxy *httputil.ReverseProxy
}
这些是我正在加载的结构。然后我遍历映射以在代理结构中创建 ReverseProxy 对象并启动服务。
for host, proxy := range config.Proxies {
log.Printf("Loading proxies for: %s", host)
log.Printf("Upstream: %s", proxy.Upstream)
log.Printf("SkipVerify: %t", proxy.SkipVerify)
remoteURL, err := url.Parse(proxy.Upstream)
if err != nil {
log.Fatalf("Unable to parse target: %v", err)
}
log.Infof("Remote : %v", remoteURL)
proxy.HostProxy = httputil.NewSingleHostReverseProxy(remoteURL)
proxy.HostProxy.Transport = &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 15 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
TLSClientConfig: &tls.Config{InsecureSkipVerify: proxy.SkipVerify},
}
log.Print(proxy.HostProxy.Transport)
}
log.Info("Starting Up on Port", config.Port)
http.Handle("/", &config)
log.Fatal(http.ListenAndServe(":"+strconv.Itoa(config.Port), &config))
当它被调用时,我会这样处理:
func (config *Configuration) ServeHTTP(w http.ResponseWriter, r *http.Request) {
host := r.Host
r.Host = r.URL.Host
log.Info(config)
if proxy, ok := config.Proxies[host]; ok {
log.Infof("Processing request for %s", host)
log.Printf("Upstream: %s", proxy.Upstream)
log.Printf("SkipVerify: %t", proxy.SkipVerify)
log.Print(proxy.HostProxy.Transport)
proxy.HostProxy.ServeHTTP(w, r)
} else {
w.Write([]byte("403: Host forbidden " + host))
}
}
但它会抛出 proxy.HostProxy 对象为 nil 的异常。所有其他数据都保留并正确记录。比如proxy.Upstream 和proxy.SkipVerify。
解决方案
推荐阅读
- mongodb - 我的 mongodb 是存储刷新令牌的正确位置吗?
- javascript - GCP:Stripe webhook 错误:未找到与有效负载的预期签名匹配的签名
- gitlab - Gitlab 与 Hashicorp Vault 的集成
- .net-core - Ocelot Gateway Aggregation:当每个 API 有不同的 Query String 参数时
- reactjs - React 应用程序、.NET Core 3.1 API 和对 Microsoft Graph 的调用的配置
- javascript - 有没有办法从一开始就制作动画 gif 播放?
- python - 使用布局切片时,Django 脆皮表单“提供给 {%crispy %} 标签的帮助对象必须是一个crispy.helper.FormHelper 对象”
- python - 为什么不应该在 Django 的生产级使用 MEDIA_ROOT 和 MEDIA_URL?
- python-3.x - ruamel yaml 禁用转储别名
- reactjs - MongoDB - Next.js 我无法映射数据