浅谈apache和nginx的rewrite的区别


Posted in PHP onFebruary 22, 2013

1. Nginx Rewrite规则相关指令

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

rewrite ^/b/(.*)\.html /play.php?video=$1 break;

如果加上if语句,示例如下:
if (!-f $request_filename)

{ rewrite ^/img/(.*)$ /site/$host/images/$1 last;      }

2. Nginx与Apache的Rewrite规则实例对比

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

 Apache Rewrite 规则:

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

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

Nginx Rewrite 规则:

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 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;   

}

PHP 相关文章推荐
一个php作的文本留言本的例子(三)
Oct 09 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
深入PHP FTP类的详解
Jun 13 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
layui数据表格自定义每页条数limit设置
Oct 26 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 #PHP
php连接mssql数据库的几种方法
Feb 21 #PHP
PHP递归调用的小技巧讲解
Feb 19 #PHP
PHP递归返回值时出现的问题解决办法
Feb 19 #PHP
PHP递归算法的详细示例分析
Feb 19 #PHP
七款最流行的PHP本地服务器分享
Feb 19 #PHP
浅析PHP递归函数返回值使用方法
Feb 18 #PHP
You might like
PHP的开合式多级菜单程序
2006/10/09 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python日志记录模块实例及改进
2017/02/12 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
python爬虫基础之urllib的使用
2020/12/31 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
C语言中break与continue的区别
2012/07/12 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
简单的辞职信范文
2014/01/18 职场文书
双方协议书
2014/04/22 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
小学新教师个人总结
2015/02/05 职场文书