Nginx服务器下使用rewrite重写url以实现伪静态的示例

经过网上查阅和测试,发现Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则

  rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;  

而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:

  rewrite "^/([0-9]{5}).html$" /viewthread.php?tid=$1 last;  

同时将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 {  listen 80;  server_name ccvita.com www.ccvita.com;  location / {      index index.html index.htm index.php;      root /www/wwwroot/ccvita.com;      if (-f $request_filename/index.html){          rewrite (.*) $1/index.html break;      }      if (-f $request_filename/index.php){          rewrite (.*) $1/index.php;      }      if (!-f $request_filename){          rewrite (.*) /index.php;      }    }  location ~ .php$ {      include fastcgi_params;      fastcgi_index index.php;      fastcgi_pass 127.0.0.1:8787;      fastcgi_param SCRIPT_FILENAME /www/wwwroot/ccvita.com$fastcgi_script_name;      }  location /ccvita-status {      stub_status on;      access_log off;      }  }    

Discuz!的Rewrite
下面的Rewrite中百分号前面多了个转移字符“”,这在Apache中是需要的,而在Nginx中则是不需要的。

  rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;    

正确的应该是

  rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last;  

这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。
Nginx实例代码

  server {    listen    80;    server_name www.ccvita.com ccvita.com;      location / {       index      index.html index.htm index.php;       root      /www/www.ccvita.com;       rewrite ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2 last;       rewrite ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3 last;       rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;       rewrite ^(.*)/profile-(username|uid)-(.+).html$ $1/viewpro.php?$2=$3 last;       rewrite ^(.*)/space-(username|uid)-(.+).html$ $1/space.php?$2=$3 last;       rewrite ^(.*)/tag-(.+).html$ $1/tag.php?name=$2 last;      }        location ~ .php$ {          include fastcgi_params;          fastcgi_index index.php;          fastcgi_pass 127.0.0.1:8694;          fastcgi_param SCRIPT_FILENAME /www/www.ccvita.com$fastcgi_script_name;      }      location /www.ccvita.com-status {       stub_status on;       access_log off;    }  }  

参与评论