浅谈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 相关文章推荐
最省空间的计数器
Oct 09 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 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 ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
javascript getElementsByClassName函数
2010/04/01 Javascript
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
js实现动态改变radio状态的方法
2018/02/28 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
javascript前端实现多视频上传
2020/12/13 Javascript
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python使用minimax算法实现五子棋
2019/07/29 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
农田水利实习自我鉴定
2013/09/19 职场文书
付款委托书范本
2014/04/04 职场文书
创业培训计划书
2014/05/03 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
python对文档中元素删除,替换操作
2022/04/02 Python
js判断两个数组相等的5种方法
2022/05/06 Javascript