Home  >  Article  >  Backend Development  >  I can't change host header using reverse proxy

I can't change host header using reverse proxy

王林
王林forward
2024-02-10 08:12:18438browse

I cant change host header using reverse proxy

During website development or maintenance, sometimes we encounter the problem of being unable to use a reverse proxy to change the host header. This may cause us some troubles and limitations. In this article, PHP editor Xiaoxin will explain why this problem occurs and how to solve it. Whether you are a beginner or an experienced developer, this article will provide you with useful solutions and tips to help you overcome this problem and successfully complete your website development work.

Question content

I'm building a reverse proxy for my backend but I don't understand why even if I change the host header using any of the methods I've seen in the documentation it doesn't will not change. The backend requires a real host to serve the correct content.

This is the 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

This would be simple if it could be added in go1.20 using (*proxyrequest).seturl:

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

For more information, see this proposal: net/http/httputil: Replace director with rewrite一个>.

If you cannot upgrade to go1.20, here is a solution for 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,
  }

See the documentation for http.request.host:

For client requests, the host can choose to override the host header to be sent. If empty, the request.write method will use the value of url.host.

The above is the detailed content of I can't change host header using reverse proxy. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete