代码之家  ›  专栏  ›  技术社区  ›  Darian Hickman

httputil.newsinglehostreverseeproxy缺少什么配置?

  •  1
  • Darian Hickman  · 技术社区  · 7 年前

    下面的代码将在下面进一步生成错误。当我打字时” http://www.cnn.com/favicon.ico “直接进入任何浏览器都能正常工作。我猜我错过了反向代理的一些关键配置。要使它工作,最少需要多少配置?

    package main
    
    import (
        "net/http"
        "net/http/httputil"
        "net/url"
        "log"
    )
    
    func main(){
        url, _ := url.Parse("http://www.cnn.com/favicon.ico")
        proxy := httputil.NewSingleHostReverseProxy(url)
        http.HandleFunc("/", proxy.ServeHTTP)
        log.Fatal(http.ListenAndServe(":9090", nil))
    }
    

    快速错误:未知域:localhost。请检查此域 已添加到服务中。

    详细信息:CACHE-LAX8625-LAX

    七月四日快乐!

    1 回复  |  直到 7 年前
        1
  •  2
  •   cdk    7 年前

    我做了以下两个更改以使其工作:

    首先,将代理指向 www.cnn.com 而不是 www.cnn.com/favicon.ico 。当然,现在我们必须向 localhost:9090/favicon.ico .

    接下来,设置代理请求 Host 字段指向目标主机,而不是代理的主机 localhost .

    代码最终如下所示:

    package main
    
    import (
        "log"
        "net/http"
        "net/http/httputil"
        "net/url"
    )
    
    type Director func(*http.Request)
    
    func (f Director) Then(g Director) Director {
        return func(req *http.Request) {
            f(req)
            g(req)
        }
    }
    
    func hostDirector(host string) Director {
        return func(req *http.Request) {
            req.Host = host
        }
    }
    
    func main() {
        url, _ := url.Parse("http://www.cnn.com")
        proxy := httputil.NewSingleHostReverseProxy(url)
    
        d := proxy.Director
        // sequence the default director with our host director
        proxy.Director = Director(d).Then(hostDirector(url.Hostname()))
    
        http.Handle("/", proxy)
        log.Fatal(http.ListenAndServe(":9090", nil))
    }