浅谈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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
phpMyAdmin 安装教程全攻略
Mar 19 PHP
php相当简单的分页类
Oct 02 PHP
php explode函数实例代码
Feb 27 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
php提取微信账单的有效信息
Oct 01 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 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中HTTP_REFERER函数用法实例
2014/11/21 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
Vue.js之slot深度复制详解
2017/03/10 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python实现简单字典树的方法
2016/04/29 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Python descriptor(描述符)的实现
2020/11/15 Python
文职个人求职信范文
2013/09/23 职场文书
六五普法规划实施方案
2014/03/21 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
中学生操行评语大全
2014/04/24 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
后勤工作个人总结
2015/02/28 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
vue实现列表垂直无缝滚动
2022/04/08 Vue.js