У меня есть следующий код Go для реализации обратного прокси:
r := mux.NewRouter()
urls := []struct {
prefix string
url string
}{
{"/kibana", "http://104.196.209.244:5601"},
{"/", "http://www.google.com"},
}
for _, i := range urls {
prefix := i.prefix
redURL := i.url
r.PathPrefix(prefix).HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
target, _ := url.Parse(redURL)
if prefix != "/" {
r.URL.Path = strings.TrimPrefix(r.URL.Path, prefix)
}
log.Printf("Forwarding to %s%s", target, r.URL.Path)
log.Printf("%#v", r.URL)
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.Transport = DebugTransport{}
proxy.ServeHTTP(w, r)
})
}
http.Handle("/", r)
У меня есть пара префиксов, один - /
, а другой - /kibana
. Если запрос приходит в корневой путь, я просто перенаправить на google.com. Однако, если дело доходит до /kibana
, я перенаправляю на конечную точку кибаны. Однако конечная точка кибаны при посещении будет перенаправлена на http://<kibana-ip>/app/kibana
. В результате, когда я перехожу на указанный выше HTTP-сервер, меня не перенаправляют на домашнюю страницу кибаны.
Если я посещаю, http://<go-program>/kibana
в журналах написано:
2019/10/09 12:10:28 Forwarding to http://104.196.209.244:5601
2019/10/09 12:10:28 &url.URL{Scheme:"", Opaque:"", User:(*url.Userinfo)(nil), Host:"", Path:"", RawPath:"", ForceQuery:false, RawQuery:"", Fragment:""}
2019/10/09 12:10:29 Forwarding to http://www.google.comapp/kibana
2019/10/09 12:10:29 &url.URL{Scheme:"", Opaque:"", User:(*url.Userinfo)(nil), Host:"", Path:"app/kibana", RawPath:"", ForceQuery:false, RawQuery:"", Fragment:""}
GET /app/kibana HTTP/1.1
Ошибка возникает, когда я пытаюсь обработать перенаправление HTTP с конца кибаны.
Итак, как правильно вызывать NewSingleHostReverseProxy
без перезаписиr.URL.Path
такой, что любые дальнейшие перенаправления будут работать со старым путем (/kibana
тоже)?
Я понимаю, что если я передам Director
NewSingleHostReverseProxy
, я смогу что-то сделать, но я не уверен, какие поля изменить в Director.
Если бы я использовал nginx, то здесь я бы делал proxy_pass
, чтобы правильно передать URL.