首頁  >  文章  >  後端開發  >  我無法使用反向代理更改主機標頭

我無法使用反向代理更改主機標頭

王林
王林轉載
2024-02-10 08:12:18438瀏覽

我無法使用反向代理更改主機標頭

在進行網站開發或維護過程中,有時我們會遇到無法使用反向代理來更改主機標頭的問題。這可能會給我們帶來一些困擾和限制。在這篇文章中,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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除