我正在使用一个反向代理,它根据路径指定的服务名称代理不同的远程计算机。在这个场景中,我遇到了类似的情况:
远程1:
- 路线1:
---文件1 - 路线2:
- nestedRoute:
------文件2
请求如下所示:
客户端-> fqdn/service 1/route 2/nestedRoute --> remote 1
响应是(我在反向代理中修改了asset的路径--见下文):
Client <- fqdn/route2/nestedRoute <-- remote1
浏览器中所需的响应:
Client <--- fqdn/service1/route2/nestedRoute <-- remote1
如何像上面那样将service 1注入到路径中,以便后续请求解析到正确的目录?
我的代码或多或少是这样的:
func proxy(serviceName string) func(res http.ResponseWriter, req *http.Request){
cnn, err := dialer.Dial("tcp",":1250") // Reason for doing this is relative to architecture and is a must.
if err != nil {
res.WriteHeader(http.StatusInternalServerError)
return
}
transport := &http.Transport{
Dial: func(network, addr string) (net.Conn, error) {
return cnn, nil
},}
client := &http.Client{
Transport: transport,
}
hostName := hostNameMap[serviceName]
req.URL.Host = req.Host
req.URL.Scheme = originSvr.Scheme
req.RequestURI = ""
req.URL.Path = string.TrimPrefix(req.url.path,"/serviceName")
serverResponse, err := client.Do(req)
if err != nil {
res.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(res, req)
return
}
res.WriteHeader(serverResponse.StatusCode)
io.Copy(res, serverResponse.Body)
}
func main() {
http.handle("/",rootHandler)
http.Handle("/service1", http.HandlerFunc(proxy("service1")))
http.Handle("/service2", handler)
http.ListenAndServe(":8080", nil)
}
字符串
我目前正在考虑将body读入一个缓冲区,并修改所有到路由的链接,尽管这看起来相当脆弱。或者,我正在考虑为每个服务创建一个iframe,并在每个iframe中从root服务反向代理的内容。
否则,我不知道如何处理重定向与我目前如何有东西设置。
1条答案
按热度按时间q0qdq0h21#
在这种情况下,我可以控制远程机器上的应用程序。更具体地说,我正在运行一个wsgi应用程序,我能够指定一个前缀路径,每当访问该网站时,该路径就会被删除和前置。按照这里的说明解决了我的问题:https://dlukes.github.io/flask-wsgi-url-prefix.html