Maison >développement back-end >Golang >Le proxy inverse Golang n'est pas accessible

Le proxy inverse Golang n'est pas accessible

王林
王林original
2020-03-12 11:26:092835parcourir

Le proxy inverse Golang n'est pas accessible

Tout d'abord, voyons comment obtenir une structure de proxy inverse

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 utilise une fermeture en tant que directeur pour créer une nouvelle structure ReverseProxy, et le directeur is C'est la fonction proxy que nous implémentons par défaut. Dans cette fonction, le protocole, l'hôte et le chemin de l'URL de la requête sont réécrits. Mais il ne réécrit pas req.Host, ce qui fait que notre proxy inverse ne peut effectuer un proxy que localement. Il suffit donc de modifier cette fonction. Il existe deux manières de la modifier.

(Tutoriel recommandé : tutoriel golang )

Méthode de modification :

1 Nous pouvons copier la fonction NewSingleHostReverseProxy et la modifier Quoi qu'il en soit, cette fonction. Ce n'est pas compliqué non plus, puis utilisez notre fonction personnalisée pour créer un nouveau proxy là où la structure de proxy inverse est nécessaire.

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}
}

Remplacez ensuite httputil.NewSingleHostReverseProxy(u) par NewProxy(u) pour proxy vers d'autres noms de domaine.

2. Personnaliser la fonction Directeur. Nous utilisons toujours la fonction NewSingleHostReverseProxy pour créer un nouveau proxy, puis personnalisons une fonction Director pour celui-ci.

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

Tutoriels vidéo associés recommandés : tutoriel vidéo Golang

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn