apache_rewrite详解[1]

时间 : 14-10-26 栏目 : linux运维 作者 : 老薛 评论 : 0 点击 : 1,673 次

实验环境:

操作系统:CentOS release 5.5

Apache2.2.15+Mysql 5.0.56+PHP 5.2.6

说明:

Apache 在安装的时候确保已安装rewrite模块[--enable-rewrite ],检查命令如下:

[xuekun@nagios ~]$ /application/apache/bin/apachectl -l|grep rewrite.c

mod_rewrite.c #有此结构证明mod_rewrite模块已安装

http://apache.jz123.cn/mod/mod_rewrite.html【中文文档】

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。

注释:

那么DSO究竟是什么?事实上DSO是Dynamic Shared Objects(动态共享目标)的缩写,他是现代Unix派生出来的操作系统都存在着的一种动态连接机制。他提供了一种在运行时将特别格式的代码,在程式 运行需要时,将需要的部分从外存调入内存执行的方法。Apache在1.3以后的版本后开始支持他。因为Apache早就使用一个模块概念来扩展他的功能并且在内部使用一个基于调度的列表来链接扩展模块到Apache核心模块.所以, Apache早就注定要使用DSO来在运行时加载他的模块。

2、为什么需要用重写规则?
一个网站,如果是长期需要放在internet上提供服务,必定会有不断地更新和维护,如临时转移到其它服务器进行维护,重新组织目录结构,变换URL甚至改变到新的域名等等,而为了让客户不会因此受到任何影响,最好的方法就是使用Apache Rewrite Rule(重写规则)。

例如:www.bdkyr.com

现在:woaimaidong.blog.chinaunix.net

3、重写规则的作用范围
1) 可以使用在Apache主配置文件httpd.conf中
2) 可以使用在httpd.conf里定义的虚拟主机配置中  ×
3) 可以使用在基本目录的跨越配置文件.htaccess中

4、重写规则的应用条件
只有当用户的WEB请求最终被导向到某台WEB服务器的Apache后台,则这台WEB服务器接受进来的请求,根据配置文件该请求是主配置还是虚拟主机,再根据用户在浏览器中请求的 URI来配对重写规则并且根据实际的请求路径配对.htaccess中的重写规则。最后把请求的内容传回给用户,该响应可能有两种:

1) 对浏览器请求内容的外部重定向(Redirect)到另一个URL。

让浏览器再次以新的URI发出请求(R=301或者R=302,临时的或是永久的重定向)如:一个网站有正规的URL和别名URL,对别名URL进行重定向到正规URL,或者网站改换成了新的域名则把旧的域名重定向到新的域名(Redirect)

2) 也可能是由Apache内部子请求代理产生新的内容送回给客户[P,L]

这是Apache内部根据重写后的URI内部通过代理模块请求内容并送回内容给客户,而客户端浏览器并不知道,浏览器中的URI不会被重写。但实际内容被Apache根据重写规则后的URI得到。

如:在公司防火墙上运行的Apache启动这种代理重写规则,代理对内部网段上的WEB服务器的请求。

5、重写规则怎样工作?
我们假定在编译Apache时已经把mod_rewrite编译成模块,确信你的httpd.conf中有  LoadModule rewrite_module libexec/mod_rewrite.so
并且在Addmodule中有  Addmodule mod_rewrite.c  则可以使用重写规则。 当外部请求来到Apache,Apache调用重写规则中的定义来重写由用户浏览器指定请求的URI,最后被重写的URI如果是重定向,则送由浏览器作再一次请求;如果是代理则把重写后的URI交给代理模块请求最终的内容(Content),最后把内容送回给浏览器。

6、何时使用.htaccess中的重写规则定义?
假如你对你的的网站内容所在的服务器没有管理员权限,或者你的网站放在ISP的服务器 上托管等等条件下,你无法改写主配置文件,然而你可以对你的WEB站点内容所在的目录有写权限,则你可以设置自己的.htaccess 文件达到同样的目的。但你需要确定主配置文件中对你的网站所在的目录定义了下面的内
容:

Options Indexes FollowSymLinks
AllowOverride all

否则你的.htaccess不会工作

 

7、指令集

7.1 RewriteEngine 指令

说明:打开或关闭运行时的重写引擎

语法:RewriteEngine on|off

注解:RewriteEngine指令打开或关闭运行时的重写引擎。如果设置为off,则此模块在运行时不执行任何重写操作, 同时也不更新SCRIPT_URx环境变量。使用该指令可以使此模块无效,而无须注释所有的RewriteRule指令!

注意:默认情况下,重写配置是不可继承的,也就是必须在每个需要使用重写引擎的虚拟主机中设置一个RewriteEngine on指令。

7.2 RewriteCond 指令

说明:定义重写发生的条件,可以理解为“筛选条件”

语法:RewriteCond TestString CondPattern [flags] 示例:!^woaimaidong.blog.chinaunix.net !^maidong.cn

注解:TestString是一个纯文本的字符串。

CondPattern是一个perl兼容的正则表达式。

7.3 RewriteRule 指令

说明:为重写引擎定义重写规则。

语法:RewriteRule Pattern Substitution [flags]

注解:Pattern是一个作用于当前URL的perl兼容的正则表达式。"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL截然不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。重写规则中的Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。

RewriteRule指令是重写引擎的根本。此指令可以多次使用。每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要——在运行时,规则是按这个顺序逐一生效的。

8、Rewrite规则表达式的说明:

. 匹配任何单字符 示例:r.t 匹配rat、rut、r.t但是不匹配root

[chars] 匹配字符串:chars 示例:

[^chars] 不匹配字符串:chars

text1|text2 可选择的字符串:text1或text2 示例:jpg|gif|png|SWF

? 匹配0到1个字符 示例:r? 匹配r和ra、rc、rd

* 匹配0到多个字符 示例:r*匹配:r、ra、rb、refdgc

+ 匹配1到多个字符 示例:r+匹配:rr、rak、rcdgck

^ 字符串开始标志   示例^r 匹配rc、rd、re

$ 字符串结束标志   示例r$ 匹配cr、dr,er   示例 ^R*H$

\n 转义符标志

 

()标记表达式的开始和结尾。可以保存子表达式以备将来之用

正则表达式中括号的三种功能:

1)限定多选结构的范围;如:ab(c|d|e)fgh,注意上述写法与去掉括号时 abc|d|efgh 的区别

2)标注量词作用的元素;如:ab(cde)+fgh,注意上述写法与去掉括号时 abcde+fhg的区别

3)为引用捕获文本;作为这个用法加括号是为了返回或引用匹配结果

 

反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9),$N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。

 

反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9),%N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。

RewriteCond——定义重写发生的条件,可以理解为“筛选条件”

RewriteRule——为重写引擎定义重写规则

RewriteRule ^(.*)$ http://www.b.com$1 [R,L]

上文中的意思是将匹配过的信息转换成www.b.com,$1意思是“正则表达式中的域/参数传递”

RewriteLog /tmp/rewrite.log

RewriteLogLevel 3

日志存储位置和日志的记录等级(最高为8级)

综合分析:

^/(.*) #实例www.xxx.com/movie;www.xxx.com/logo.gif;www.xxx.com/mp3.html等

^(.*)   #实例www.xxx.com?id=2 及上面的所有

9、Apache的URL重写规则的标志

1) R[=code](force redirect) 强制外部重定向

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

 

2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。

3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

4) P(force proxy) 强制使用代理转发。

5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

6) N(next round) 重新从第一条规则开始运行重写过程。

7) C(chained with next rule) 与下一条规则关联

 

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

 

8) T=MIME-type(force MIME type) 强制MIME类型

9) NS (used only if no internal sub-request) 只用于不是内部子请求

10) NC(no case) 不区分大小写

11)'ornext|OR' ( next condition)

  • Use this to combine rule conditions with a local OR instead of the implicit AND. Typical example:
  • RewriteCond %{REMOTE_HOST} ^host1.* [OR]
  • RewriteCond %{REMOTE_HOST} ^host2.* [OR]
  • RewriteCond %{REMOTE_HOST} ^host3.*
  • RewriteRule ...some special stuff for any of these hosts...

12) QSA(query string append) 追加请求字符串

13) NE(no URI escaping of output) 不在输出转义特殊字符,此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%25', '%24', '%3B'等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:

例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE]将能正确的将/foo/zed转换成/bar?arg=P1=zed

说明:=为 %3d URL中的表示方法为 %hex

14) PT(pass through to next handler) 传递给下一个处理

例如:

RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理

Alias /def /ghi

15) S=num(skip next rule(s)) 跳过num条规则

16) E=VAR:VAL(set environment variable) 设置环境变量

本文标签

除非注明,文章均为( 老薛 )原创,转载请保留链接: http://www.bdkyr.com/xtyw002/315.html

apache_rewrite详解[1]:等您坐沙发呢!

发表评论

7 + 9 = ?


博主微信号,很高兴为您提供帮助

随便看看

为您推荐

0