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.

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 :)


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;
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.