Http 反向代理零指针

Http 反向代理零指针,http,go,reverse-proxy,Http,Go,Reverse Proxy,我正试图在golang中编写一个反向代理,以重用该代理,但我得到了一个nil指针,原因我看不出来 type Configuration struct { Proxies map[string]Proxy `mapstructure:"proxies"` Port int `mapstructure:"port"` } type Proxy struct { Upstream string `mapstr

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

请用stacktrace及其指向的代码更新您的问题。。。。无论如何,
代理
是一个值的映射,而不是指针,当您在这样一个映射上进行范围调整时,您在每次迭代中得到的是映射中值的副本,在循环中修改副本不会修改映射中的原始值。将其更改为代理映射[字符串]*Proxy。或者,在初始化
proxy.hosporxy
之后,应该将
proxy
迭代变量设置到映射中,覆盖原始变量,即
config.proxy[host]=proxy
。。。。下面是上述评论的一个例子:D'oh。你说得对,就是这样。非常感谢。