Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Saya tidak boleh menukar pengepala hos menggunakan proksi terbalik

Saya tidak boleh menukar pengepala hos menggunakan proksi terbalik

王林
王林ke hadapan
2024-02-10 08:12:18438semak imbas

Saya tidak boleh menukar pengepala hos menggunakan proksi terbalik

Semasa pembangunan atau penyelenggaraan laman web, kadangkala kami menghadapi masalah tidak dapat menggunakan proksi terbalik untuk menukar pengepala hos. Ini boleh menyebabkan kita mengalami beberapa masalah dan batasan. Dalam artikel ini, editor PHP Xiaoxin akan menerangkan mengapa masalah ini berlaku dan cara menyelesaikannya. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda penyelesaian dan petua yang berguna untuk membantu anda mengatasi masalah ini dan berjaya menyelesaikan kerja pembangunan tapak web anda.

Kandungan soalan

Saya sedang membina proksi terbalik untuk bahagian belakang saya tetapi saya tidak faham mengapa ia tidak akan berubah walaupun saya menukar pengepala hos menggunakan mana-mana kaedah yang saya lihat dalam dokumentasi. Bahagian belakang memerlukan hos sebenar untuk menyampaikan kandungan yang betul.

Ini kodnya:

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

Penyelesaian

Akan mudah jika ia boleh ditambah dalam go1.20 menggunakan (*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,
}

Untuk maklumat lanjut, lihat cadangan ini: net/http/httputil: Gantikan pengarah dengan tulis semula一个>.

Jika anda tidak dapat menaik taraf ke go1.20, berikut adalah penyelesaian untuk 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,
  }

Lihat dokumentasi untuk http.request.host:

Untuk permintaan pelanggan, hos boleh memilih untuk mengatasi pengepala hos yang akan dihantar. Jika kosong, kaedah request.write akan menggunakan nilai url.host.

Atas ialah kandungan terperinci Saya tidak boleh menukar pengepala hos menggunakan proksi terbalik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam