Ich kann den Host-Header nicht über den Reverse-Proxy ändern

王林
Freigeben: 2024-02-10 08:12:18
nach vorne
444 Leute haben es durchsucht

Ich kann den Host-Header nicht über den Reverse-Proxy ändern

Während der Website-Entwicklung oder -Wartung stoßen wir manchmal auf das Problem, dass wir keinen Reverse-Proxy verwenden können, um den Host-Header zu ändern. Dies kann zu Problemen und Einschränkungen führen. In diesem Artikel erklärt der PHP-Editor Xiaoxin, warum dieses Problem auftritt und wie man es löst. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel nützliche Lösungen und Tipps, die Ihnen helfen, dieses Problem zu überwinden und Ihre Website-Entwicklungsarbeit erfolgreich abzuschließen.

Inhalt der Frage

Ich baue einen Reverse-Proxy für mein Backend, verstehe aber nicht, warum er sich nicht ändert, selbst wenn ich den Host-Header mit einer der Methoden ändere, die ich in der Dokumentation gesehen habe. Das Backend benötigt einen echten Host, um den richtigen Inhalt bereitzustellen.

Das ist der 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)
}
Nach dem Login kopieren

Workaround

Es wäre einfach, wenn es in go1.20 mit (*proxyrequest).seturl hinzugefügt werden könnte:

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,
}
Nach dem Login kopieren

Weitere Informationen finden Sie in diesem Vorschlag: net/http/httputil: Director durch rewrite ersetzen.

Wenn Sie kein Upgrade auf go1.20 durchführen können, finden Sie hier eine Lösung für 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,
  }
Nach dem Login kopieren

Siehe die Dokumentation für http.request.host:

Bei Client-Anfragen kann der Host den zu sendenden Host-Header überschreiben. Wenn leer, verwendet die Methode „request.write“ den Wert von url.host.

Das obige ist der detaillierte Inhalt vonIch kann den Host-Header nicht über den Reverse-Proxy ändern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!