2017-04-21 119 views
1

我在想如何为nginx编写正确的重写,因为它每次都会失败。NGINX动态URL的重写规则

我有一个页面,可以访问没有任何动作(http://foo.bar/praemienshop/)或在url中的参数,然后触发一个动作(http://foo.bar/praemienshop/1)。该参数应始终为数字。如果可能的话,如果没有给出参数,结束斜线应该是可选的。 这是我tryed:

location /praemienshop { 
     rewrite ^/praemienshop(|/)([0-9]+/.*?)?$ /index.php?url=praemienshop&item=$1; 
} 

荫能开foo.bar/praemienshop但每次我打开foo.bar/praemienshop/3(或任何其他数值),它只是抛出没有找到404。

我既不擅长编写正则表达式,也不完全了解在nginx中如何重写。我曾在IIS中工作,但将它导入nginx很难。

感谢您的任何帮助。

+0

'$ 1'是第一个捕获'(| /)' - 你应该尝试'$ 2'。 –

+0

感谢您的帮助理查德。但是这不能解决它。如果我添加一个数字,它仍会抛出一个404(例如:foo.bar/praemienshop/3) –

回答

1

正如您目前所拥有的,您正在使用错误的捕获并且正则表达式与URI不匹配。尝试:

rewrite ^/praemienshop(?:/([0-9]+))?$ /index.php?url=praemienshop&item=$1; 

在上述正则表达式,所述(?:是一个非捕获基团。

请参阅this useful resource on regular expressions

+0

非常感谢,这就像一个魅力!我还有很多东西要学习正则表达式;-) –

+0

我还有一个问题理查德,我怎么能重写一个url,如果用户输入一个带有结尾.gif的url,.gif被移除,文件名被重写一个参数就像上面的例子一样? –

+0

像'^(。*)\。gif $'这样的结构将捕获URI减去扩展名。 –