我正在尝试使用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
和
答案 0 :(得分:1)
我发现,通过提供自定义的Director功能,而不是使用NewSingleHostReverseProxy()(https://golang.org/src/net/http/httputil/reverseproxy.go)提供的默认功能,可以实现所需的行为。我通过将req.URL.Path设置为target.Path而不添加原始的req.URL.Path来完成此操作。除此之外,Director功能与reverseproxy.go中的功能非常相似。