Apache和Nginx的Rewrite规则对比
一.Apache的rewrite
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的
(httpd.conf)和目录级的(.htaccess) 两种方式。如果要想用到rewrite模块,必须先安装或加
载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,另一种是编译
apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。基于服务器级
的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打
开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说
明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则
virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在
.htaccess里要声明RewriteEngine on。2.字符含义介绍:
Rewrite标志
R[=code](force redirect) 强制外部重定向
G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
P(force proxy) 强制使用代理转发。
L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
N(next round) 重新从第一条规则开始运行重写过程。
C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过
T=MIME-type(force MIME type) 强制MIME类型
NS (used only if no internal sub-request) 只用于不是内部子请求
NC(no case) 不区分大小写
QSA(query string append) 追加请求字符串
NE(no URI escaping of output) 不在输出转义特殊字符
例如:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
PT(pass through to next handler) 传递给下一个处理
Rewrite时服务器变量:
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
connection & request: REMOTE_ADDR, QUERY_STRING
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
system stuff: TIME_YEAR, TIME_MON, TIME_DAY
3.实际操作
在httpd-vhosts.conf中的写法如下:
RewriteRule ^/jiaju/([a-z]+)/des.html /jiaju/index.php?c=jiaju&a=designerList&city=$1
RewriteRule ^/jiaju/([a-z]+)/des_r([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignPrice=$2
RewriteRule ^/jiaju/([a-z]+)/des_c([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignStyle=$2
RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2
RewriteRule ^/jiaju/([a-z]+)/des_r([\d]+)_c([\d]+).html
/jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignPrice=$2&DesignStyle=$3
RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_r([\d]+).html
/jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3
RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_c([\d]+).html
/jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignStyle=$3
RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_r([\d]+)_c([\d]+).html
/jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3&DesignStyle=$4
以上rewrite可用一条规则匹配,如下
RewriteRule ^/jiaju/([a-z]+)/des(?:_s([\d]*))?(?:_r([\d]))?(?:_c([\d]*))?.html
/jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3&DesignStyle=$4
#装修报价rewrite规则
RewriteRule ^/jiaju/([a-z]+)/zxbj(?:_r([\d]*))?(?:_s([\d]*))?(?:_f([\d]*))?(?:_a([\d]*))?(?:_p([\d]*))?.html
/jiaju/index.php?c=jiaju&a=zxbj&city=$1&CaseRoom=$2&CaseStyle=$3&CasePictureType=$4&Area=$5&Price=$6上面一条亦可拆分成以下两条规则:
RewriteRule ^/jiaju/([a-z]+)/zxbj(?:_r([\d]*))?(?:_s([\d]*))?(.*) $4city=$1&CaseRoom=$2&CaseStyle=$3 [C,NC]
RewriteRule ^(?:_f([\d]*))?(?:_a([\d]*))?(?:_p([\d]*))?.html(.*)
/jiaju/index.php?c=jiaju&a=zxbj&$4&CasePictureType=$1&Area=$2&Price=$3 [QSA,NC,L]可以从以上规则中感受apache的rewrite规则。
值得注意的是apache的rewrite规则参数若超过十个则得分成两条来写! 而在nginx中是通过重命名的方式实现,具体讲解见下面。
二.Nginx的rewrite规则:
Nginx的rewrite重定向相当于apache的RewriteRule,具体讲解如下:
它可以用在server,location 和IF条件判断块中,例子如下
server
{
#指定监听端口
listen 80;
#指定服务器域名
server_name mm.test.fang.com;
#指定能解析的页面
index index.html index.htm index.php;
#指定实际的工作代码路径
root /opt/lampp/htdocs/www;
rewrite ^/ http://www.c1gstudio.com/;
access_log off;
}
location ~* ^/zf_bs/ {
#rewrite ^/zf_bs/(.*) /zf_bs/$1;
rewrite ^/([a-z]*)_?(\d*)_?(\d*)/?p?([0-9,]*)t?(\d*)m?(\d*)s?(\d*)h?(\d*)o?(\d*)f?(?P<f>\d*)d?(?P<d>\d*)p?x?(?P<px>\d*)/? /zf/?purpose=%B1%F0%CA%FB&city=$1&district=$2&comarea=$3&price=$4&buildclass=$5&rtype=$6&housetype=$7&room=$8&towards=$9&floor=$f&equipment=$d&orderby=$px&rewrite last;
}这一条rewrite规则在apache中的实现:
RewriteRule
^/([a-z]*)_?(\d*)_?(\d*)/?p?([0-9,]*)t?(\d*)m?(\d*)s?(\d*)h?(\d*)(.*)/$ $9&&purpose=%B1%F0%CA%FB&city=$1&district=$2&comarea=$3&price=$4&buildclass=$5&rtype=$6&housetype=$7&room=$8 [C,NC]
RewriteRule
^o?(\d*)f?(\d*)d?(\d*)x?(\d*)&&(.*) /zf/index.php?$5&towards=$1&floor=$2&equipment=$3&orderby=$4&rewrite [QSA,L,NC]
nginx中若多于十个条件的用重命名的方式表示 ,如f?(?P<f>\d*) (实际上是一种匹配规则),但在nginx中不支持此法,只能分成两条来写
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
关键字符介绍:
last – 此条规则匹配完后不在向下匹配 ,相当于apache的L;
break– 中止Rewirte,不在继续匹配;
redirect – 返回临时重定向的HTTP状态302;
permanent – 返回永久重定向的HTTP状态301;匹配判断的特殊字符:
~ 为区分大小写匹配;!~为区分大小写不匹配;
~*为不区分大小写匹配;
!~为不区分大小写不匹配。
(nginx更多介绍将“nginx学习篇”)
Apache和Nginx的Rewrite规则对比的更多相关文章
- Nginx的Rewrite规则与实例
通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有 ...
- Nginx之Rewrite规则
IF语句: http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if 首先申明nginx只有i ...
- Nginx 设置rewrite规则是遇到的一个{}大括号引发的报错问题
一个群友提到: 用nginx image_filter模块裁图,用!拼宽高能够实现,现在想用参数传宽高总是报错,配置如下: location ~ ^/images/.* { if ( $q ...
- Nginx 之 Rewrite 规则
write 规则介绍 Rewite 规则作用 Rewrite规则可以实现对url的重写,以及重定向 作用场景: URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 SEO优化 维护:后台 ...
- nginx 带? rewrite 规则
由于需要重定向 url ,nginx需要rewrite .参考文献 http://huangqiqing123.iteye.com/blog/2083434 需求:将http://10.106.1.3 ...
- nginx 重定向 rewrite 规则
1.rewrite配置 server { listen 80 default_server; server_name jeson.t.imooc.io; access_log /var/log/ngi ...
- 修改Nginx 伪静态Rewrite规则 安装Chevereto
Chevereto 是目前最为强大的 PHP 图床系统,通过它可部署多用户公开或私有的图片存储服务,现在 Chevereto 出了免费的版本,小伙伴可以围观一下. https://github.com ...
- nginx的rewrite规则
301跳转: server { listen 80; server_name www.xiaofan.com; return 301 https://$server_name$request_uri; ...
- Nginx与Apache的Rewrite规则的区别
一.Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx R ...
随机推荐
- java final修饰变量时的一种情况
有如下一种场景. 1.在文件PaymentConfig.java中存在如下变量public static final desc="描述" 2.类Test.java中使用了desc变 ...
- 我的Java学习笔记-Java面向对象
今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...
- vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
今天分享的不是技术,今天给大家分享个插件,针对现有的vue右键菜单插件,大多数都是需要使用插件本身自定义的标签,很多地方不方便,可扩展性也很低,所以我决定写了一款自定义指令调用右键菜单(vuerigh ...
- 【LeetCode】Unique Binary Search Trees II 异构二叉查找树II
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4048209.html 原题: Given n, generate all struc ...
- C++实现String容器的基本功能
本文只实现String类的构造函数.析构函数.赋值构造函数和赋值函数,其他操作不再详述,一般的笔试面试基本上也只会要求实现这四个函数的功能. #include <iostream> usi ...
- laravel通过Eloquent ORM实现CURD
//Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...
- code format using astyle
script context : #! /bin/bash for f in $(find . -name '*.c' -or -name '*.cpp' -or -name '*.h' -type ...
- svn: E200009: 'lib/systemd/system/dropbear@.service': a peg revision is not allowed here problem
case: svn add lib/systemd/system/dropbear@.service svn: E200009: 'lib/systemd/system/dropbear@.servi ...
- [置顶]使用scrapy_redis,自动实时增量更新东方头条网全站新闻
存储使用mysql,增量更新东方头条全站新闻的标题 新闻简介 发布时间 新闻的每一页的内容 以及新闻内的所有图片.项目文件结构. 这是run.py的内容 1 #coding=utf-8 2 from ...
- SqlServer中的merge操作(转载)
SqlServer中的merge操作(转载) 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...