我缺少httputil.NewSingleHostReverseProxy的什么配置?

时间:2018-07-04 19:57:35

标签: go reverse-proxy

下面的代码在下面进一步产生错误。当我直接在任何浏览器中键入“ 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

7月4日快乐!

1 个答案:

答案 0 :(得分:2)

我进行了以下2处更改以使其正常工作:

首先,将代理指向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))
}