Lors du développement ou de la maintenance d'un site Web, nous rencontrons parfois le problème de ne pas pouvoir utiliser un proxy inverse pour modifier l'en-tête de l'hôte. Cela peut nous causer des problèmes et des limitations. Dans cet article, l'éditeur PHP Xiaoxin expliquera pourquoi ce problème se produit et comment le résoudre. Que vous soyez débutant ou développeur expérimenté, cet article vous apportera des solutions et conseils utiles pour vous aider à surmonter ce problème et à mener à bien vos travaux de développement de site Web.
Je construis un proxy inverse pour mon backend mais je ne comprends pas pourquoi il ne changera pas même si je modifie l'en-tête de l'hôte en utilisant l'une des méthodes que j'ai vues dans la documentation. Le backend nécessite un véritable hébergeur pour diffuser le bon contenu.
Voici le code :
proxy := &httputil.ReverseProxy{ Director: func(req *http.Request) { targetURL := url.URL{ Scheme: "http", Host: "backend.com", Path: req.URL.Path, } req.URL.Scheme = targetURL.Scheme req.URL.Host = targetURL.Host req.URL.Path = targetURL.Path req.Header.Set("Host", targetURL.Host) }, Transport: transport, } // Listen on a local port and serve the reverse proxy without buffer method server := &http.Server{ Addr: "localhost:8080", Handler: proxy, } fmt.Println("Listening on :8080...") err = server.ListenAndServe() if err != nil { fmt.Println(err) }
Ce serait facile si vous pouviez utiliser (*proxyrequest).seturlajouté dans go1.20:
proxy := &httputil.reverseproxy{ rewrite: func(pr *httputil.proxyrequest) { targeturl := url.url{ scheme: "http", host: "backend.com", path: req.url.path, } pr.seturl(&targeturl) }, transport: transport, }
Pour plus d'informations, consultez cette proposition : net/http/httputil : Remplacer le directeur par la réécriture一个>.
Si vous ne parvenez pas à passer à go1.20, voici une solution pour director
:
proxy := &httputil.ReverseProxy{ Director: func(req *http.Request) { targetURL := url.URL{ Scheme: "http", Host: "backend.com", Path: req.URL.Path, } req.URL.Scheme = targetURL.Scheme req.URL.Host = targetURL.Host req.URL.Path = targetURL.Path - req.Header.Set("Host", targetURL.Host) + req.Host = targetURL.Host + // or simply: + // req.Host = "" }, Transport: transport, }
Voir la documentation de http.request.host :
Pour les demandes des clients, l'hôte peut choisir de remplacer l'en-tête de l'hôte à envoyer. Si vide, la méthode request.write utilisera la valeur de url.host.
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!