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 не может работать с параметрами запроса?

РЕДАКТИРОВАТЬ: Я не хочу переписывать все петиции. Мне нужно только переписать этот 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
местоположение = / {
  переписать ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
источник
Итак, я должен написать $ arg_, а затем имя параметра?
Дэвид Моралес
Да, это будет проще всего.
Мартин Фьордвальд
Хорошо, но я не хочу переписывать все петиции. Мне нужно только переписать этот URL, не затрагивая другие.
Дэвид Моралес
Я сделал несколько тестов. Это правило будет генерировать бесконечное перенаправление. Я напишу новый ответ с кодом, который я получил на работу. Спасибо :)
Дэвид Моралес
Я должен, вероятно, упомянуть, что вы должны объявить "location /" помимо "location = /", чтобы избежать рекурсии. Я думаю, что вы будете использовать его для proxy_pass где-то в качестве основного маршрута. "location = /" соответствует точно / запросам. В любом случае, сопоставление $ args кажется нормальным, за исключением того, что оно будет соответствовать любому запросу с параметрами? Param1 = val1 & ....
rzab