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