Обратный прокси-сервер Golang не найден или запрещенные ошибки - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь создать обратный прокси-сервер, который принимает все запросы и перенаправляет их на целевой 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)
}

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

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

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

1 Ответ

0 голосов
/ 05 марта 2019

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

...