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