在進行網站開發或維護過程中,有時我們會遇到無法使用反向代理來更改主機標頭的問題。這可能會給我們帶來一些困擾和限制。在這篇文章中,php小編小新將為大家解釋為什麼會出現這個問題,以及如何解決這個問題。無論你是初學者還是有經驗的開發者,本文都將為你提供有用的解決方案和技巧,幫助你克服這個難題,順利完成你的網站開發工作。
我正在為我的後端建立一個反向代理,但我不明白為什麼即使我使用我在文件中看到的任何方法更改主機標頭它也不會改變。 後端需要真正的主機才能提供正確的內容。
這是程式碼:
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) }
如果可以使用(*proxyrequest).seturl新增在 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, }
有關更多信息,請參閱此提案:net/http/httputil:用 rewrite 替換 director一个>.
如果無法升級到go1.20,這裡有一個針對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, }
請參閱 http.request.host 的文件:
對於客戶端請求,主機可以選擇覆蓋要傳送的主機標頭。如果為空,request.write 方法將使用 url.host 的值。
以上是我無法使用反向代理更改主機標頭的詳細內容。更多資訊請關注PHP中文網其他相關文章!