Ketika saya menjelajah ke URL ini: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) menerimanya apa adanya:
GET /foo/%5B-%5D HTTP/1.1
Namun ketika saya proksi aplikasi ini melalui nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
Permintaan yang sama dialihkan melalui port nginx diteruskan dengan jalur diterjemahkan:
GET /foo/[-] HTTP/1.1
Tanda kurung siku yang didekode dalam jalur GET menyebabkan kesalahan pada server target ( Status HTTP 400 - Karakter ilegal di jalur ... ) saat tiba tanpa diloloskan.
Apakah ada cara untuk menonaktifkan decoding URL atau menyandikannya kembali sehingga server target mendapatkan jalur yang sama persis ketika dialihkan melalui nginx? Beberapa aturan penulisan ulang URL yang pintar?
Jawaban:
Mengutip Valentin V. Bartenev (siapa yang harus mendapatkan kredit penuh untuk jawaban ini):
sumber
http://localhost:8080/
kehttp://localhost:8080
dalam kasus orang memiliki situasi yang sama seperti yang saya lakukan.Perhatikan bahwa penguraian URL, umumnya dikenal sebagai
$uri
"normalisasi" dalam dokumentasi nginx, terjadi sebelum backend IFF:baik URI ditentukan dalam
proxy_pass
dirinya sendiri, bahkan jika hanya garis miringnya dengan sendirinya,atau, URI diubah selama pemrosesan, misalnya melalui
rewrite
.Kedua kondisi secara eksplisit didokumentasikan di http://nginx.org/r/proxy_pass (penekanan milikku):
Solusinya adalah dengan menghilangkan URI seperti dalam kasus OPs, atau, memang, menggunakan
rewrite
aturan pintar :Anda dapat melihatnya langsung di jawaban Stack Overflow terkait , termasuk grup kontrol.
sumber
http://localhost:8080
). Jika Anda tidak setuju, Anda dapat melakukannya dengan penulis RFC 3986.