Saya tidak boleh menukar pengepala hos menggunakan proksi terbalik

王林
Lepaskan: 2024-02-10 08:12:18
ke hadapan
444 orang telah melayarinya

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)
}
Salin selepas log masuk

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,
}
Salin selepas log masuk

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,
  }
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!