Heim >Backend-Entwicklung >Golang >Ich kann den Host-Header nicht über den Reverse-Proxy ändern

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

王林
王林nach vorne
2024-02-10 08:12:18478Durchsuche

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

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen