GoLang反向代理多个目标URL,无需附加子路径

时间:2019-01-27 04:48:58

标签: go proxy reverse-proxy

我正在尝试使用net/httputil/ReverseProxy在Golang中编写一个反向代理,该代理能够将请求转发到不同的目标URL,而无需附加代理URL子路径。

例如: 如果我的代理URL是PROXYURL,(信誉不足,无法发布8个以上的链接,甚至是假示例链接,因此都用PROXYURL替换链接),

我希望PROXYURL/app1转发请求到TARGET1/directory,并且我希望PROXYURL/app2转发到TARGET2/directory2

当前,我使用NewSingleHostReverseProxy()创建以下ReverseProxy http处理程序,并将它们绑定到所需的子路径(/app1/app2)。

import (
    "fmt"
    "net/http"
    "net/http/httputil"
)

func main() {
    port := "6666"
    proxy1 = httputil.NewSingleHostReverseProxy("http://target1.com/directory")
    proxy2 = httputil.NewSingleHostReverseProxy("http://target2.com/directory2")

    http.Handle("/app1", proxy1)
    http.Handle("/app2", proxy2)
    http.ListenAndServe(fmt.Sprintf(":%s", port), nil) 
}

但是,每当我运行此程序并将请求发送到PROXYURL/app1时,它就会代理TARGET1/directory/app1。我了解到,根据ReverseProxy的描述,这是预期的行为(将代理URL的子路径附加到目标)。但是,我想知道是否可以将代理URL子路径(/app1)映射到另一个目标URL,而无需将子路径附加到目标URL。

总之,我想要

http://proxy.com/app1-> http://target1.com/directory

http://proxy.com/app2-> http://target2.com/directory2

不是(当前正在发生)

http://proxy.com/app1-> http://target1.com/directory/app1

http://proxy.com/app2-> http://target2.com/directory2/app2

1 个答案:

答案 0 :(得分:1)

我发现,通过提供自定义的Director功能,而不是使用NewSingleHostReverseProxy()(https://golang.org/src/net/http/httputil/reverseproxy.go)提供的默认功能,可以实现所需的行为。我通过将req.URL.Path设置为target.Path而不添加原始的req.URL.Path来完成此操作。除此之外,Director功能与reverseproxy.go中的功能非常相似。