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