Maison  >  Article  >  développement back-end  >  Je ne peux pas modifier l'en-tête de l'hôte à l'aide du proxy inverse

Je ne peux pas modifier l'en-tête de l'hôte à l'aide du proxy inverse

王林
王林avant
2024-02-10 08:12:18435parcourir

Je ne peux pas modifier len-tête de lhôte à laide du proxy inverse

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.

Contenu de la question

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

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer