Maison > développement back-end > Golang > 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

王林
Libérer: 2024-02-10 08:12:18
avant
477 Les gens l'ont consulté

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

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

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

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!

source:stackoverflow.com
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