nginx重写为干净的网址

时间:2010-08-27 06:19:48

标签: nginx url-rewriting

我想要实现的目标是让那些去过的人: http://www.example.com/ $ SEARCH-QUERY / $ PAGE-NUMBER重定向到search.php?query = SEARCH-QUERY& page = PAGE-NUMBER

我刚想出如何安装nginx并配置php-fpm,mysql等等,但现在我对重写有点困惑。这就是我所拥有的,似乎无法正常工作:

如果没有与它一起发送页面查询,php脚本将自动假设它是第一页,我也不得不做两个重写规则,因为我无法弄清楚如何在一行上实现它以便它可以拥有它有和没有尾随斜线。

rewrite ^/search/(.*)$ /search.php?query=$1; 
rewrite ^/search/(.*)$/ /search.php?query=$1;

然后是使用分页结果查看的项目

rewrite ^/search/(.*)/(.*)$ /search.php?query=$1&page=$2;
rewrite ^/search/(.*)/(.*)$/ /search.php?query=$1&page=$2;

如果有人可以请求帮助,我会非常感激!

2 个答案:

答案 0 :(得分:3)

您的正则表达式中存在基本错误。

^/search/(.*)$/永远不会匹配,因为$表示“字符串结束”。在字符串结束后,您不能拥有/

如果您需要可选的/,则regex中有?修饰符。

所以,试试/search/(.*)/?$

答案 1 :(得分:1)

此外,您的第一个正则表达式^/search/(.*)/?$将匹配/search/开头的所有请求:它会将页码推送到搜索字符串中,同时也会因为{{1}包含空字符串,它将匹配空搜索字符串。如果第二个正则表达式*稍后出现,它将永远不会匹配。如果要将字符串捕获到第一个斜杠,请使用^/search/(.*)/(.*)/?$^/search/([^/]+)/?$(因此通配符匹配不包括^/search/([^/]+)/([^/]+)/?$的字符串而不是所有字符的字符串,并且{ {1}}匹配一个或多个而不是任意数字。)