首页 > 解决方案 > 反向代理零指针

问题描述

我正在尝试在 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。

标签: httpgoreverse-proxy

解决方案


推荐阅读