LNMP下nginx rewrite 规则参考


nginx 下.htaccess 文件的配置说明,设置改动后必须重启服务才会生效。

LNMP下nginx的.htaccess设置

1. 在需要使用.htaccess文件的目录下新建一个.htaccess文件, 
如在一个网站根目录: 
vi /home/wwwroot/www.ndsky.com/.htaccess

2. 在里面输入需要的伪静态规则: 
# nginx rewrite rule
rewrite  ^/news/2(.*)/(.*)$  http://$host/news/$2 permanent;
rewrite /u9/v-150715.htm  http://$host/k8/278.htm permanent;
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; 
# end nginx rewrite rule 
:wq保存退出。

3. 修改nginx配置文件: 
vi /usr/local/nginx/conf/vhost/www.abc.com.conf ( 或者 /usr/local/nginx/conf/nginx.conf )

4. 在需要添加伪静态的虚拟主机的server{}中引入.htaccess文件: 
include /home/wwwroot/www.ndsky.com/.htaccess;(把这个改成你.htaccess文件的具体位置) 
wq保存退出。

5. 重新加载nginx配置文件: 
/etc/init.d/nginx restart
或者重启lnmp    #lnmp restart  
重新打开网页看看,如果伪静态正常就证明你的rewrite rule语法是正确的。
.htaccess 文件改动后必须重启服务才会生效。

Nginx Rewrite规则相关指令

Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:

rewrite  ^/news/2(.*)/(.*)$  http://$host/news/$2 permanent;
rewrite  ^/b/(.*)\.html  /play.php?video=$1 break;


如果加上if语句,示例如下:

if (!-f $request_filename)
{
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}

Nginx与Apache的Rewrite规则实例对比

简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:

Apache Rewrite 规则:

RewriteRule ^/(cagetory1|category2)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/cagetory3/$ /zl/cagetory3.php [L]
RewriteRule ^/(category2)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/category6([0-9]*)/$ /zl/category6.php?id=$1 [L]


Nginx Rewrite 规则:

rewrite ^/(cagetory1|category2)/$ /zl/index.php?name=$1 last;
rewrite ^/cagetory3/$ /zl/cagetory3.php last;
rewrite ^/(category2)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^/category6([0-9]*)/$ /zl/category6.php?id=$1 last;


由以上示例可以看出,Apache的Rewrite规则改为Nginx的Rewrite规则,其实很简单:Apache的RewriteRule指令换成Nginx的rewrite指令,Apache的[L]标记换成Nginx的last标记,中间的内容不变。


如果Apache的Rewrite规则改为Nginx的Rewrite规则后,使用nginx -t命令检查发现nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:

rewrite  ^/([0-9]{5}).html$ /x.jsp?id=$1  last;

加上引号就正确了:
rewrite  “^/([0-9]{5}).html$” /x.jsp?id=$1  last;

Apache与Nginx的Rewrite规则在URL跳转时有细微的区别:

Apache Rewrite 规则:
RewriteRule  ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]

Nginx Rewrite 规则:
rewrite  ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/  permanent;

以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。

另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:

Apache Rewrite 规则:
RewriteRule  ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST}  [L]

Nginx Rewrite 规则:
rewrite  ^/user/login/$ /user/login.php?login=1&forward=http://$host   last;

Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:

Apache的RewriteCond指令对应Nginx的if指令;
Apache的RewriteRule指令对应Nginx的rewrite指令;
Apache的[R]标记对应Nginx的redirect标记;
Apache的[P]标记对应Nginx的last标记;
Apache的[R,L]标记对应Nginx的redirect标记;
Apache的[P,L]标记对应Nginx的last标记;
Apache的[PT,L]标记对应Nginx的last标记;

允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com

Apache Rewrite 规则:
RewriteCond %{HTTP_HOST}    ^(.*?)\.domain\.com$
RewriteCond %{HTTP_HOST}    !^qita\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [L]

Nginx的if指令不支持嵌套,也不支持AND、OR等多条件匹配,相比于Apache的RewriteCond,显得麻烦一些,但是,我们可以通过下一页的Nginx配置写法来实现这个示例:

Nginx Rewrite 规则:
if ($host ~* ^(.*?)\.domain\.com$)
{
set $var_wupin_city $1;
set $var_wupin ‘1′;
}
if ($host ~* ^qita\.domain\.com$)
{
set $var_wupin ‘0′;
}
if (!-f $document_root/market/$var_wupin_city/index.htm)
{
set $var_wupin ‘0′;
}
if ($var_wupin ~ ‘1′)
{
rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}

 相关内容