nginx переписати для URL з параметрами


16

У мене є URL такого типу:

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

І я хочу перенаправити це на це:

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

Тож я спробував це правило перезаписати без успіху:

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

Чи nginx не може вирішити параметри запиту?

EDIT: Я не хочу переписувати всі прохання. Мені потрібно лише переписати цю URL-адресу, не зачіпаючи інших.

Відповіді:


15

Гаразд, завдяки початковій допомозі rzab, я переробив його правило на це робоче рішення:

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

Я щойно додав умову уникати нескінченних рекурсій, а? в кінці правила позбутися початкових парам . Це прекрасно працює :)


1
Рядок запиту допускає різний порядок параметрів. Тож ваша ifперестане працювати, коли, наприклад, param2піде раніше param1.
Олександр Азаров

Цікаво. У моєму випадку це не відбудеться, оскільки це URL-адреса, яку можна натиснути електронною поштою, але це добре знати. Спасибі.
Девід Моралес

4
location = / {
  переписати ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

Отже, чи потрібно написати $ arg_, а потім ім'я параметра?
Девід Моралес

Так, це було б найпростіше.
Мартін Фьордвальд

Гаразд, але я не хочу переписувати всі прохання. Мені потрібно лише переписати цю URL-адресу, не зачіпаючи інших.
Девід Моралес

Я зробив кілька тестів. Це правило призведе до нескінченного перенаправлення. Я напишу нову відповідь з кодом, який я взяв на роботу. Дякую :)
Девід Моралес

Я, мабуть, мушу зазначити, що вам потрібно оголосити "location /" крім "location = /", щоб уникнути рекурсії. Я думаю, вам доведеться прокси_pas десь як основний маршрут. "location = /" точно відповідає / запитам. У будь-якому випадку, збіг $ args здається нормальним, за винятком того, що він відповідатиме будь-якому запиту з параметрами? Param1 = val1 & ....
rzab
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.