nginx menulis ulang menambahkan parameter di akhir url

13

Saya perlu mengonfigurasi proxy terbalik saya sehingga parameter berikut akan ditambahkan di akhir url: &locale=de-de

Ini hampir berhasil:

rewrite ^(.*)$ $1&locale=de-de break;

Namun, masalahnya adalah saya harus menambahkan '& locale = de-de' hanya jika belum ada dan jika ada '?' di url ...

Bisakah saya mendapatkan bantuan dalam merumuskan regex yang benar untuk melakukan ini?

Pertanyaan lain: Mengapa tanda tanya di url saya tidak ditampilkan jika saya menggunakan ini:
$ uri? $ Args

Atau $ uri $ is_args $ args menerjemahkan url yang tidak disandikan dan tanda tanya ditampilkan sebagai% 3f.

Ide ide?

EDIT: Tampaknya perilaku ini ada saat menggunakan dalam kombinasi dengan proxy_pass. Dalam penulisan ulang sederhana itu berfungsi dengan sangat baik.

Sascha
sumber

Jawaban:

15
  1. Di dalam rewritekamu cocok dengan bagian jalur URL saja. Yang berarti, $1tidak akan berisi string kueri.
  2. Secara default, Nginx menambahkan string kueri asli ke penggantian penulisan ulang.

Jadi, aman untuk menulis

rewrite ^(.*)$ $1?locale=de-de break;

Jika Anda tidak ingin Nginx menambahkan string kueri asli, cukup tentukan ?di akhir URL pengganti:

rewrite ^(.*)$ $1?locale=de-de? break;
Alexander Azarov
sumber
Terima kasih! Saya tidak melihat bahwa saya mencoba melakukannya dengan cara yang salah.
Sascha
A + ini adalah jawaban terbaik
Terima kasih
3

Kecocokan untuk rewritetidak menyertakan parameter permintaan, jadi Anda perlu mengujinya di tempat lain.

Mencoba:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
sumber
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Alexander Azarov
@Alexander Poin bagus; yang rewriteperlu lastmenjadi jika-aman. Diedit.
Shane Madden
3

Tidak rewritemengubah parameter permintaan, hanya bagian jalur URI. Dalam pengalaman saya, mengotak-atik penulisan ulang mengarah ke siklus aneh, di mana parameter baru akan ditambahkan ad infinitum. Menulis ulang mungkin bukan cara untuk melakukan ini di Nginx.

Sebagai gantinya, Anda harus memodifikasi $argsvariabel menggunakan setarahan:

set $args $args&locale=de-de;
Palimondo
sumber
Saya tidak setuju bahwa $argsharus dimutasi. Sebagai gantinya, lihat solusi @ AlexanderAzarov.
Terima kasih