浅谈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 如何向 MySQL 发送数据
Oct 09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
php include和require的区别深入解析
Jun 17 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
php中引用符号(&)的使用详细介绍
Dec 06 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
PHP多例模式介绍
2013/06/24 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
vue实现简单的MVVM框架
2018/08/05 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
小程序实现分类页
2019/07/12 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python发送邮件实现基础解析
2020/08/14 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
县级文明单位申报材料
2014/05/23 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
详细总结Python常见的安全问题
2021/05/21 Python
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏