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.