Nginx berjalan pada port 80, dan saya menggunakannya untuk membalikkan URL proxy dengan jalur /foo
ke port 3200
dengan cara ini:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Ini berfungsi dengan baik, tetapi saya memiliki aplikasi pada port 3200
, di mana saya tidak ingin inisial /foo
dikirim. Yaitu - ketika saya mengakses http://localhost/foo/bar
, saya hanya ingin /bar
menjadi jalur yang diterima oleh aplikasi. Jadi saya mencoba menambahkan baris ini ke blok lokasi di atas:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Ini menyebabkan 302 redirect (perubahan URL), tetapi saya ingin 301. Apa yang harus saya lakukan?
nginx
reverse-proxy
301-redirect
jeffreyveon
sumber
sumber
Jawaban:
Redirect apa pun ke localhost tidak masuk akal dari sistem jarak jauh (misalnya browser Web klien). Jadi flag penulisan ulang permanen (301) atau redirect (302) tidak dapat digunakan dalam kasus Anda.
Silakan coba pengaturan berikut menggunakan aturan penulisan ulang transparan:
Gunakan
curl -i
untuk menguji penulisan ulang Anda. Perubahan yang sangat halus pada aturan dapat menyebabkan nginx melakukan redirect.sumber
/foo(.*)
, jikaexample.com/foo
tidak , tidak akan cocok. (yang mungkin apa yang dialami jeffreyveon)Pencocokan awalan lokasi sederhana berfungsi untuk ini tanpa menggunakan aturan penulisan ulang selama Anda menentukan URI dalam direktif proxy_pass:
Perhatikan tambahan
/
di akhirproxy_pass
arahan. NGINX akan menghapus awalan yang cocok/foo
dan meneruskan sisanya ke server backend di URI/
. Karenanya,http://myserver:80/foo/bar
akan dikirim ke backend dihttp://localhost:3200/bar
.Dari dokumen NGINX di proxy_pass :
sumber
//xyz
ke host jika Anda melakukannya.Cara yang paling benar mutlak dan praktik terbaik biasanya sebagai berikut:
Perhatikan pentingnya trailing slash in
proxy_pass
, yang secara otomatis mengubah$uri
variabel agar yang ada/foo/
di front-end sesuai dengan/
di backend. Tidak perlurewrite
arahan eksplisit .Selain itu, perhatikan bahwa jejak
/
di dalamlocation
juga cukup penting - tanpanya, Anda berisiko memiliki URL yang tampak aneh di situs Anda pada satu titik (mis.,/fooen
Selain bekerja/foo/en
).Selain itu, trailing
/
dilocation
denganproxy_pass
juga memastikan beberapa penanganan khusus , sesuai dengan dokumentasi darilocation
direktif, untuk secara efektif menyebabkan implisitlocation = /foo {return 301 /foo/;}
juga.Jadi, dengan mendefinisikan a
location
dengan trailing slash seperti di atas, Anda tidak hanya memastikan bahwa URL sufiks slash-less seperti/fooen
tidak akan valid, tetapi juga bahwa/foo
tanpa trailing slash akan terus berfungsi juga.Dokumentasi rujukan:
sumber
$args
hilang:http://frontend/foo?bar=baz
akan diproksikan kehttp://backend/
. Perhatikan bahwa args bukan bagian dari url$args
masih harus ditangani dengan tepat jika Anda menggunakan kode di atas, karena mereka terpisah dari$uri
, dan harus dikumpulkan kembali, kecuali jika Anda menggunakan variabel eksplisit diproxy_pass
./foo
dialihkan ke/foo/
, jadi, kecuali jika Anda melakukan sesuatu yang aneh di backend, bahkan/foo
permintaan masih akan bekerja dengan kode di atas. (Ini sebenarnya sudah bagian dari jawabannya, BTW.)mencoba
atau
sumber
//xyz
ke host jika Anda melakukannya.@Terabuck Maaf karena belum menjawab tidak ada perwakilan.
Anda tidak boleh menggunakan localhost karena Anda bergantung pada kenyataan bahwa aplikasi berjalan pada server dengan file host. host lokal hanya terjemahan default ke 127.0.0.1. Tidak ada yang menyatakan bahwa Anda harus memiliki file host ini. Sangat umum untuk memilikinya.
Memiliki antarmuka loopback sekali lagi adalah hal yang umum untuk bergantung tetapi Anda masih bergantung pada antarmuka loopback pada tumpukan jaringan. Ini adalah kasus yang langka untuk tidak memiliki keduanya. Jika Anda pernah khawatir tentang ini. Setidaknya pada unix / linux Anda memiliki opsi untuk soket. Ini akan menghilangkan kebutuhan untuk tumpukan jaringan untuk mencapai localhost. Berhati-hatilah dengan pendekatan ini karena ada beberapa faktor yang akan terjadi pada OS host. Seperti jumlah file yang terbuka dll.
sumber