I can't change host header using reverse proxy

王林
Release: 2024-02-10 08:12:18
forward
444 people have browsed it

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)
}
Copy after login

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,
}
Copy after login

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,
  }
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!