Nginx服务器下使用rewrite重写url以实现伪静态的示例
经过网上查阅和测试,发现Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则
rewrite^/([0-9]{5}).html$/viewthread.php?tid=$1last;
而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:
rewrite"^/([0-9]{5}).html$"/viewthread.php?tid=$1last;
同时将RewriteRule为Rewrite,基本就实现了Nginx的Rewrite规则到Apache的Rewite规则的转换。
Rewrite的Flags
- last-基本上都用这个Flag。
- break-中止Rewirte,不在继续匹配
- redirect-返回临时重定向的HTTP状态302
- permanent-返回永久重定向的HTTP状态301
WordPress的Rewrite
其实在Nginx下配置WordPress的Rewrite还是比较简单的,在location/{..................}里面加入
if(!-f$request_filename){ rewrite(.*)/index.php; }
即可实现。
下面是一个完整的vhost的配置文件
server{ listen80; server_nameccvita.comwww.ccvita.com; location/{ indexindex.htmlindex.htmindex.php; root/www/wwwroot/ccvita.com; if(-f$request_filename/index.html){ rewrite(.*)$1/index.htmlbreak; } if(-f$request_filename/index.php){ rewrite(.*)$1/index.php; } if(!-f$request_filename){ rewrite(.*)/index.php; } } location~\.php${ includefastcgi_params; fastcgi_indexindex.php; fastcgi_pass127.0.0.1:8787; fastcgi_paramSCRIPT_FILENAME/www/wwwroot/ccvita.com$fastcgi_script_name; } location/ccvita-status{ stub_statuson; access_logoff; } }
Discuz!的Rewrite
下面的Rewrite中百分号前面多了个转移字符“\”,这在Apache中是需要的,而在Nginx中则是不需要的。
rewrite^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$/viewthread.php?tid=$1&extra=page\%3D$3&page=$2last;
正确的应该是
rewrite^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$/viewthread.php?tid=$1&extra=page%3D$3&page=$2last;
这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。
Nginx实例代码
server{ listen80; server_namewww.ccvita.comccvita.com; location/{ indexindex.htmlindex.htmindex.php; root/www/www.ccvita.com; rewrite^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$$1/archiver/index.php?$2last; rewrite^(.*)/forum-([0-9]+)-([0-9]+)\.html$$1/forumdisplay.php?fid=$2&page=$3last; rewrite^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$$1/viewthread.php?tid=$2&extra=page%3D$4&page=$3last; rewrite^(.*)/profile-(username|uid)-(.+)\.html$$1/viewpro.php?$2=$3last; rewrite^(.*)/space-(username|uid)-(.+)\.html$$1/space.php?$2=$3last; rewrite^(.*)/tag-(.+)\.html$$1/tag.php?name=$2last; } location~\.php${ includefastcgi_params; fastcgi_indexindex.php; fastcgi_pass127.0.0.1:8694; fastcgi_paramSCRIPT_FILENAME/www/www.ccvita.com$fastcgi_script_name; } location/www.ccvita.com-status{ stub_statuson; access_logoff; } }