Maison > développement back-end > Golang > le corps du texte

Le proxy inverse Golang n'est pas accessible

王林
Libérer: 2020-03-12 11:26:09
original
2812 Les gens l'ont consulté

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}
}
Copier après la connexion

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}
}
Copier après la connexion

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
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal