我正在尝试使用 net/httputil/ReverseProxy
在 Golang 中编写一个反向代理,它能够将请求转发到不同的目标 URL,而无需附加代理 URL 子路径。
例如: 如果我的代理 URL 是 PROXYURL(没有足够的声誉来发布超过 8 个链接,甚至是假的示例链接,因此将链接替换为 PROXYURL),
我希望 PROXYURL/app1
将请求转发到 TARGET1/directory
并且我希望 PROXYURL/app2
转发到 目标2/目录2
目前,我使用 NewSingleHostReverseProxy()
创建以下 ReverseProxy http 处理程序,并将它们绑定(bind)到所需的子路径(/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
和
最佳答案
我发现通过提供自定义的Director函数而不是使用NewSingleHostReverseProxy() (https://golang.org/src/net/http/httputil/reverseproxy.go)提供的默认函数,我能够实现我想要的行为。我通过将 req.URL.Path 设置为 target.Path 并且不附加原始的 req.URL.Path 来做到这一点。除此之外,director 功能与reverseproxy.go 中的非常相似。
关于GoLang 反向代理多个目标 URL,无需附加子路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385164/