nginx viết lại nối thêm một tham số ở cuối url


13

Tôi cần định cấu hình proxy ngược của mình để tham số sau sẽ được thêm vào cuối url: &locale=de-de

Điều này gần như hoạt động:

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

Tuy nhiên, vấn đề là tôi cần phải thêm '& locale = de-de' chỉ khi nó chưa có ở đó nếu có '?' trong url ...

Tôi có thể nhận được một số trợ giúp về việc xây dựng regex chính xác để làm điều này không?

Một câu hỏi khác: Tại sao dấu hỏi trong url của tôi không được hiển thị nếu tôi sử dụng:
$ uri? $ Args

Hoặc $ uri $ is_args $ args dịch url không được mã hóa và dấu hỏi được hiển thị là% 3f.

Ý tưởng?

EDIT: Có vẻ như hành vi này tồn tại trong khi sử dụng kết hợp với proxy_pass. Trong một viết lại đơn giản, nó hoạt động thực sự tốt.

Câu trả lời:


15
  1. Trong rewritebạn chỉ khớp với phần đường dẫn của URL . Có nghĩa là, $1sẽ không chứa chuỗi truy vấn.
  2. Theo mặc định, Nginx nối ​​thêm chuỗi truy vấn ban đầu để thay thế ghi lại.

Vì vậy, nó là an toàn để viết

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

Trong trường hợp bạn không muốn Nginx nối ​​thêm chuỗi truy vấn ban đầu, chỉ cần chỉ định ?ở cuối URL thay thế:

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

Cảm ơn bạn! Tôi đã không thấy rằng tôi đã cố gắng làm điều đó sai cách.
Sascha

A + đây là câu trả lời hay nhất
Cảm ơn bạn vào

3

Trận đấu rewritekhông bao gồm các thông số truy vấn, vì vậy bạn cần kiểm tra điều đó ở nơi khác.

Thử:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}


@Alexander Điểm tốt; mà rewritenhu cầu một lastlà nếu an toàn. Đã chỉnh sửa.
Shane Madden

3

Các rewritekhông sửa đổi các thông số yêu cầu, chỉ có một phần đường dẫn URI. Theo kinh nghiệm của tôi, việc lộn xộn với việc viết lại dẫn đến các chu kỳ kỳ lạ, trong đó tham số mới được thêm vào quảng cáo. Viết lại có lẽ không phải là cách để làm điều này trong Nginx.

Thay vào đó, bạn nên sửa đổi $argsbiến bằng cách sử dụng lệnh set:

set $args $args&locale=de-de;

Tôi không đồng ý rằng $argsnên bị đột biến. Thay vào đó, hãy xem giải pháp của @ AlexanderAzarov.
Cảm ơn bạn
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.