nginx viết lại cho một url với các tham số


16

Tôi có một URL thuộc loại này:

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

Và tôi muốn chuyển hướng nó đến cái này:

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

Vì vậy, tôi đã thử quy tắc viết lại này nhưng không thành công:

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

Là nginx không thể đối phó với các tham số truy vấn?

EDIT: Tôi không muốn viết lại tất cả các kiến ​​nghị. Tôi chỉ cần viết lại URL đó, mà không ảnh hưởng đến những người khác.

Câu trả lời:


15

Ok, nhờ sự giúp đỡ ban đầu của rzab, tôi đã xác định lại quy tắc của mình cho giải pháp làm việc này:

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

Tôi chỉ cần thêm một điều kiện để tránh đệ quy vô hạn, và một? vào cuối quy tắc để thoát khỏi các thông số ban đầu . Nó hoạt động hoàn hảo :)


1
Chuỗi truy vấn cho phép một thứ tự khác nhau của các tham số. Vì vậy, bạn ifsẽ ngừng làm việc khi ví dụ param2đi trước param1.
Alexander Azarov

Hấp dẫn. Trong trường hợp của tôi, điều đó sẽ không xảy ra vì đó là một url có thể nhấp trong email, nhưng thật tốt khi biết điều đó. Cảm ơn.
David Morales

4
vị trí = / {
  viết lại ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

Vì vậy, tôi phải viết $ arg_ và sau đó là tên tham số?
David Morales

Vâng, đó sẽ là dễ dàng nhất.
Martin Fjordvald

Ok, nhưng tôi không muốn viết lại tất cả các kiến ​​nghị. Tôi chỉ cần viết lại URL đó, mà không ảnh hưởng đến những người khác.
David Morales

Tôi đã thực hiện một số bài kiểm tra. Quy tắc đó sẽ tạo ra một chuyển hướng vô hạn. Tôi sẽ viết một câu trả lời mới với mã tôi đã làm việc. Cảm ơn :)
David Morales

Tôi có lẽ nên đề cập rằng bạn phải khai báo "location /" bên cạnh "location = /" để tránh đệ quy. Tôi đoán bạn sẽ có nó để proxy_pass ở đâu đó làm tuyến đường chính. "location = /" khớp chính xác / yêu cầu. Dù sao, khớp $ args có vẻ ổn, ngoại trừ nó sẽ khớp bất kỳ yêu cầu nào với các tham số? Param1 = val1 & ....
rzab
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.