Перенаправление обработки обратного прокси одного хоста - PullRequest
0 голосов
/ 09 октября 2019

У меня есть следующий код 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...