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,而不会影响其他URL。

Answers:


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;
}

因此,我必须先写$ arg_,然后再写参数名吗?
大卫·莫拉莱斯

是的,那将是最简单的。
Martin Fjordvald 2010年

好的,但是我不想重写所有请愿书。我只需要重写该URL,而不会影响其他URL。
大卫·莫拉莱斯

我做了一些测试。该规则将产生无限重定向。我将使用要使用的代码编写新的答案。谢谢:)
大卫·莫拉莱斯

我可能应该提到,除了“ location = /”之外,还必须声明“ location /”,以避免递归。我想您会将它传递到proxy_pass作为主要路线。“位置= /”与/请求完全匹配。不管怎么说,匹配ARGS $似乎确定,它除了会匹配任何与参数要求参数1 = VAL1&....?
rzab
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.