浅谈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 memcache扩展的三种安装方法
Apr 26 PHP
基于php缓存的详解
May 15 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
php除数取整示例
Apr 24 PHP
PHP获取windows登录用户名的方法
Jun 24 PHP
初识laravel5
Mar 02 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
PHP实现的json类实例
Jul 28 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP连接MYSQL数据库实例代码
Jan 20 PHP
php实现有序数组旋转后寻找最小值方法
Sep 27 PHP
PHP代码覆盖率统计详解
Jul 22 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 Smarty初体验二 获取配置信息
2011/08/08 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
定义select的边框颜色
2008/04/28 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
python 图片验证码代码分享
2012/07/04 Python
Python实现网站表单提交和模板
2019/01/15 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python实现爬山算法的思路详解
2019/04/09 Python
python把转列表为集合的方法
2019/06/28 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
python使用建议与技巧分享(二)
2020/08/17 Python
中职生自荐信范文
2014/06/15 职场文书
交警失职检讨书
2015/01/26 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers