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!