nginx menulis ulang untuk url dengan parameter

16

Saya memiliki URL jenis ini:

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

Dan saya ingin mengarahkannya ke yang ini:

http://www.example.com/newparam/val3/val4

Jadi saya telah mencoba aturan penulisan ulang ini tanpa hasil:

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

Apakah nginx tidak dapat menangani parameter kueri?

EDIT: Saya tidak ingin menulis ulang semua petisi. Saya hanya perlu menulis ulang URL itu, tanpa mempengaruhi yang lain.

David Morales
sumber

Jawaban:

15

Ok, terima kasih atas bantuan awal rzab, saya telah mendefinisikan kembali aturannya untuk solusi yang berfungsi ini:

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

Saya baru saja menambahkan kondisi untuk menghindari rekursi tak terbatas, dan a? di akhir aturan untuk menyingkirkan params awal . Ini bekerja dengan sempurna :)

David Morales
sumber
1
String kueri memungkinkan urutan parameter yang berbeda. Jadi Anda ifakan berhenti bekerja ketika mis param2berjalan sebelumnya param1.
Alexander Azarov
Menarik. Dalam kasus saya, itu tidak akan terjadi karena ini adalah url yang dapat diklik dalam surel, tetapi itu baik untuk diketahui. Terima kasih.
David Morales
4
location = / {
  tulis ulang ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
sumber
Jadi, haruskah saya menulis $ arg_ dan kemudian nama parameter?
David Morales
Ya, itu yang paling mudah.
Martin Fjordvald
Oke, tapi saya tidak ingin menulis ulang semua petisi. Saya hanya perlu menulis ulang URL itu, tanpa mempengaruhi yang lain.
David Morales
Saya sudah melakukan beberapa tes. Aturan itu akan menghasilkan pengalihan yang tak terbatas. Saya akan menulis jawaban baru dengan kode saya mulai bekerja. Terima kasih :)
David Morales
Saya mungkin harus menyebutkan, bahwa Anda harus mendeklarasikan "location /" selain "location = /" untuk menghindari rekursi. Saya kira Anda akan memilikinya ke proxy_pass di suatu tempat sebagai rute utama. "location = /" sama persis / permintaan. Ngomong-ngomong, mencocokkan $ args sepertinya ok, kecuali itu akan cocok dengan semua permintaan dengan parameter? Param1 = val1 & ....
rzab