Обратные прокси-адреса GoLang для нескольких целевых URL без добавления подпутей - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь написать обратный прокси-сервер в Golang, используя net/httputil/ReverseProxy, который может пересылать запросы на разные целевые URL-адреса без добавления подпутей URL-адреса прокси.

Например: если мой прокси-URL-адрес - PROXYURL,(недостаточно репутации, чтобы публиковать более 8 ссылок, даже поддельных, например, поэтому заменив ссылку на PROXYURL),

Я бы хотел PROXYURL/app1 для пересылки запросов на TARGET1/directory и PROXYURL/app2для переадресации на TARGET2/directory2

В настоящее время я создаю следующие http-обработчики ReverseProxy с использованием NewSingleHostReverseProxy() и привязываю их к нужным подпутям (/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

и

http://proxy.com/app2 -> http://target2.com/directory2/app2

1 Ответ

0 голосов
/ 30 января 2019

Я обнаружил, что, предоставив пользовательскую функцию Director вместо использования функции по умолчанию, предоставленной NewSingleHostReverseProxy () (https://golang.org/src/net/http/httputil/reverseproxy.go)), я смог реализовать желаемое поведение. Я сделал это, установив req.URL.Путь к target.Path и без добавления исходного req.URL.Path. Кроме этого, функция Director была очень похожа на функцию в reverseproxy.go.

...