Обратный прокси-сервер Golang возвращает ошибки «Не найдено» или «Запрещено»

Я пытаюсь создать обратный прокси-сервер, который принимает все запросы и перенаправляет их на целевой URL-адрес, например google.com или любой другой API. К сожалению, все цели возвращают такие ошибки, как страница не найдена или запрещенные ошибки.

func main() {
	r := gin.Default()

	eanAPI := api.NewEanAPI()

	routers.InitRedirectRoutes(r, eanAPI)
	port := os.Getenv("PORT")
	if len(port) == 0 {
		port = "8000"
	}
	r.Run(":" + port)
}

// InitRedirectRoutes initialize routes redirection.
func InitRedirectRoutes(r *gin.Engine, eanAPI api.EanAPI) {
	r.POST("/*action", eanAPI.ReverseProxy)
	r.GET("/*action", eanAPI.ReverseProxy)
}


type EanAPI interface {
	ReverseProxy(ctx *gin.Context)
}

type eanAPI struct {
	baseURL string
}

func NewEanAPI() EanAPI {
	return &eanAPI{}
}

func (api *eanAPI) ReverseProxy(ctx *gin.Context) {
    // proxy
    forwardToHost := "http://httpbin.org/"
    // I tried with "https://jsonplaceholder.typicode.com/" 
    "http://google.com"

	reverseProxy := proxy.NewProxy(forwardToHost)
	reverseProxy.Handle(ctx.Writer, ctx.Request, url.Parse(forwardToHost))
}

type Prox struct {
	target *url.URL
	proxy  *httputil.ReverseProxy
}

func NewProxy(target string) *Prox {
	url, _ := url.Parse(target)
	fmt.Println("url", url)
	return &Prox{target: url, proxy: httputil.NewSingleHostReverseProxy(url)}
}

func (p *Prox) Handle(w http.ResponseWriter, r *http.Request, origin *url.URL) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Header().Set("X-Forwarded-Host", r.Host)
	w.Header().Set("X-Origin-Host", origin.Host)
	r.URL.Scheme = origin.Scheme
	r.URL.Host = origin.Host

	p.proxy.ServeHTTP(w, r)
}

Я потратил много дней, пытаясь установить соответствующие заголовки, но пока ничего не получилось. Я думаю, что заголовки были установлены неправильно, но я не знаю, как скопировать заголовки с клиента и добавить их в прокси.

Я использую прокси вместо перенаправления, потому что мне нужно поработать с телом запроса и ответа!

Заранее спасибо!


person Nizar AYARI    schedule 17.09.2018    source источник
comment
Есть ли особая причина, по которой вы заново изобретаете колесо, а не используете https://golang.org/pkg/net/http/httputil/#ReverseProxy для этого?   -  person Flimzy    schedule 17.09.2018
comment
Вероятно, eanapi.ReverseProxy не делает того, во что вы верите. Мне кажется, что он генерирует запрос на получение/отправку на удаленный сервер в форме /somethingaction, эти URL-адреса не существуют на удаленном сервере.   -  person mh-cbon    schedule 17.09.2018
comment
@Flimzy Я попробовал ReverseProxy, те же ошибки!   -  person Nizar AYARI    schedule 17.09.2018
comment
@ mh-cbon, я пробовал с «/», но те же ошибки.   -  person Nizar AYARI    schedule 17.09.2018
comment
вы можете взглянуть на пакет go-micro, он делает mdns и сервисное обнаружение на его основе.   -  person zenwraight    schedule 17.09.2018


Ответы (1)


Не уверен, что это поможет, но https://golang.org/pkg/net/http/httputil/#ReverseProxy вы можете использовать функцию Director для отладки и изменения пути запроса, проверки входящих запросов. Также не забудьте изменить не только req.URL.Host, но и изменить req.Host, потому что он будет выбран настройками виртуальных хостов apache/nginx. Не сдавайтесь и не забывайте получать удовольствие :)

person sirfilip    schedule 05.03.2019
comment
У меня было это: req.URL.Host = origin.Host это отсутствовало: req.Host = origin.Host - person Mantas Karanauskas; 22.06.2020