Heim >Backend-Entwicklung >Golang >Auf den Golang-Reverse-Proxy kann nicht zugegriffen werden

Auf den Golang-Reverse-Proxy kann nicht zugegriffen werden

王林
王林Original
2020-03-12 11:26:092836Durchsuche

Auf den Golang-Reverse-Proxy kann nicht zugegriffen werden

Schauen wir uns zunächst an, wie man eine Reverse-Proxy-Struktur erhält

func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
	targetQuery := target.RawQuery
	director := func(req *http.Request) {
		req.URL.Scheme = target.Scheme
		req.URL.Host = target.Host
		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
		if targetQuery == "" || req.URL.RawQuery == "" {
			req.URL.RawQuery = targetQuery + req.URL.RawQuery
		} else {
			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
		}
		if _, ok := req.Header["User-Agent"]; !ok {
			req.Header.Set("User-Agent", "")
		}
	}
	return &ReverseProxy{Director: director}
}

NewSingleHostReverseProxy verwendet einen Abschluss als Director, um eine neue ReverseProxy-Struktur und den Director zu erstellen ist Dies ist die Proxy-Funktion, die wir standardmäßig implementieren. In dieser Funktion werden Protokoll, Host und Pfad der Anforderungs-URL neu geschrieben. Allerdings wird req.Host nicht neu geschrieben, was dazu führt, dass unser Reverse-Proxy nur lokal als Proxy fungiert. Wir müssen diese Funktion also nur ändern. Es gibt zwei Möglichkeiten, sie zu ändern.

(Empfohlenes Tutorial: Golang-Tutorial )

Änderungsmethode:

1. Wir können die Funktion NewSingleHostReverseProxy kopieren und ändern ist auch Es ist nicht kompliziert. Verwenden Sie dann unsere benutzerdefinierte Funktion, um einen neuen Proxy zu erstellen, bei dem die Reverse-Proxy-Struktur erforderlich ist.

func NewProxy(target *url.URL) *httputil.ReverseProxy {
	targetQuery := target.RawQuery
	director := func(req *http.Request) {
		req.Host = target.Host // -- 加入这句 --
		req.URL.Scheme = target.Scheme
		req.URL.Host = target.Host
		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
		if targetQuery == "" || req.URL.RawQuery == "" {
			req.URL.RawQuery = targetQuery + req.URL.RawQuery
		} else {
			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
		}
		if _, ok := req.Header["User-Agent"]; !ok {
			// explicitly disable User-Agent so it's not set to default value
			req.Header.Set("User-Agent", "")
		}
	}
	return &httputil.ReverseProxy{Director: director}
}

Ersetzen Sie dann httputil.NewSingleHostReverseProxy(u) durch NewProxy(u), um einen Proxy für andere Domänennamen zu erstellen.

2. Passen Sie die Director-Funktion an. Wir verwenden weiterhin die Funktion NewSingleHostReverseProxy, um einen neuen Proxy zu erstellen und passen dann eine Director-Funktion dafür an.

p := httputil.NewSingleHostReverseProxy(u)
d := p.Director
p.Director = func(r *http.Request) {
	d(r)
	r.Host = u.Host
}

Empfohlene verwandte Video-Tutorials: Golang-Video-Tutorial

Das obige ist der detaillierte Inhalt vonAuf den Golang-Reverse-Proxy kann nicht zugegriffen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn