|
rewrite规则:
+----------------------------------------------------------------------------------------+
此模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制.
此URL操作可以依赖于各种测试,比如服务器变量,环境变量,HTTP头,时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库.
此模块可以操作URL的所有部分(包括路径信息部分),在服务器的httpd.conf和目录级的.htaccess配置都有效,还可以最终生成请求字符串.此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至是内部代理处理
但是,所有功能和灵活性带来一个问题,那就是复杂性,因此不要指望一天内就能看懂整个模块.
+----------------------------------------------------------------------------------------+
在apache1.3中,TestString和Substitution中的特殊字符可以用前导斜杠(\)来实现转义(即忽略其特殊含义而视为普通字符).比如,Substitution可以用"\$"来包含一个美元符号,以避免apache将其看作为一个反向引用
+----------------------------------------------------------------------------------------+
环境变量:
此模块会跟踪两个额外的(非标准)CSI/SSI环境变量,SCRIPT_URL和SCRIPT_URI.他们包含了当前资源的逻辑网络视图,而标准的CGI/SSI变量SCRIPT_NAME和SCRIPT_FILENAME包含的是物理系统视图.
注意,这些变量保持的是其最初被请求时的URI/URL,即在任何重写操作之前的URI/URL.其重要性在于他们是重写URL到物理路径名称的原始数据.
示例:
SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/
+----------------------------------------------------------------------------------------+
实用方案:
我们提供了URL重写指南和高级URL重写指南文档,列举了许多基于URL的问题的使用方案,其中你可以找到真实有用的规则集
RewriteBase指令显示地设置了目录级重写的基准URL.在下文中,你可以看见RewriteRule可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用,即规则实际处理的只是隔离本地路径前缀的一部分,处理结束以后,这个路径会被自动地附着回去.默认是"RewriteBase physical-directory-path",
在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中.为此,他必须知道其对应的URL前缀或者是URI基准.通常,此前缀就是对应的文件路径.但是,大多数网站URI不是直接对应于其物理文件路径的,因而不能做这样的假定.所以在这种情况下,就必须用RewriteBase指令来指定正确的URI前缀.
>>如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定RewriteRule
例如,目录级配置路径内容如下:
#
# /abc/def/.htaccess -- per-dir config file for directory /abc/def
# Remember: /abc/def is the physical path of /xyz, i.e., the server
# has a 'Alias /xyz /abc/def'directive 例如
#
RewriteEngine On
# let the server know that we were reached via /xyz and not
# via the physical path prefix /abc/def
RewriteBase /xyz
#now the rewriting rules
RewriteRule ^oldstuff\.html$ newstuff.html
上述例子中,对/xyz/oldstuff.html的请求被正确地重写为物理的文件/abc/def/newstuff.html
For Apache Hackers
以下列出内出处理的详细步骤:
Request:
/xyz/oldstuff.html
Internal Processing:
/xyz/oldstuff.html ->/abc/def/oldstuff.html (pre-server Alias)
/abc/def/oldstuff.html -> /abc/def/newstuff.html (per-dir RewriteRule)
/abc/def/newstuff.html -> /xyz/newstuff.html (per-dir RewriteBase)
/xyz/newstuff.html -> /abc/def/newstuff.html (per-server Alias)
Result:
/abc/def/newstuff.html
虽然这个过程开起来很繁复,但是由于目录级重写到来的时机已经太晚,他不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的.但是,它的开销并不像看起来那么大,因为重新注入到Apache服务器内部运行,而且这样的过程在Apache内部也为其他许多操作所使用.所以,你可以充分信任其设计和实现都是正确的
+----------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------+
RewriteCond指令
说明:定义重写发生的条件
语法:RewriteCond TestString CondPattern
作用域:server config,virtual host,directory,.htaccess
覆盖项:FileInfo
状态:扩展(E)
模块:mod_rewrite
RewriteCond指令定义了一个规则的条件,即在一个RewriteRule指令之前有一个或多个RewriteCond指令.条件之后的重写规则仅仅在当前的URL与pattern匹配并复合这些条件的时候才会起作用.
TextString是一个纯文本的字符串,但是还可以包含下列可扩展的部分.
RewriteRule反向引用,引用的方法是:
$N
(0
将CondPattern视为纯字符串,与TestString按词典顺序进行比较.如果TestString大于CondPattern则为真.
.'=CondPattern'词典顺序的等于
将CondPattern视为纯字符串,与TestString按词典顺序进行比较.如果TestString等于CondPattern(两个字符串地完全相等)则为真.如果CondPattern是""两个双引号,则TestString与空字符串相比较.
'-d'(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录
'-f'(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件.
'-s'非空的常规文件
将TestString视为一个路径名称并测试它是否是一个存在的,尺寸大于0的常规文件
-l 符号连接
将TestString视为一个路径名并测试他是否是一个存在的符号连接
-x可执行
将TestString视为一个路径名,并测试它是否为一个存在的,具有可执行权限的文件.该权限是由操作系统检测.
-f 对子请求存在的文件
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问的.它使用一个内部子请求做检查,由于会降低服务器的性能,所以谨慎使用
-U(对子请求存在的URL)
检查TestString是否是一个有效的URL,而且可以在服务器当前的访问控制配置下访问.它使用一个内部子请求来做检查,由于会降低服务器的性能.所以谨慎使用.
//notice
所有这些测试都可以用惊叹号做前缀(!)以实现测试条件的反转
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
还可以在CondPattern之后追加特殊的标记[flag]作为RewriteCond指令的第三个参数.flags是一个以逗号分隔的以下标记的列表.
'nocase|NC'(忽略大小写)
它是测试大小写,扩展后的TestString和CondPattern中的'A-Z'和'a-z'是没有区别的.此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用.
'ornext|OR'(或下一个条件)
他以OR方式组合若干规则的条件,而是隐含的AND.典型的例子:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule ....针对这三个主机的规则集合
举例:
如果按照请求的"User-Agent:"重写一个站点的主页,可以这样写:
RewriteCond %{HTTP_USER_AGENT}% ^Mozilla.*
RewriteRule ^/$ /homepage.max.html [L]
RewriteCond %{HTTP_USER_AGENT}% ^Lynx.*
RewriteRule ^/$ /homepage.min.html [L]
RewriteRule ^/$ /homepage.std.html [L]
解释:
如果你使用的浏览器的标志是'Mozilla',则你得到内容最大化的主页(含有Frames等等).如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页(不含table等等).如果上述条件都不满足(使用的是其他浏览器),则你得到的是一个标准的主页.
+----------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------+
+----------------------------------------------------------------------------------------+
RewriteEngine指令
说明:打开或者关闭运行时的重写引擎
语法:RewriteEngine on|off
默认值:RewriteEngine off
作用域:server config, virtual host,directory,.htaccess
覆盖项:FileInfo
状态:扩展(E)
模块:mod_rewrite
RewriteEngine指令打开或关闭运行时的重写引擎.如果设置为off,则此模块在运行时不执行任何重写操作,同时也不更新SCRIPT_URx环境变量.
使用该指令可以使此模块无效,则无需注释所有的RewriteRule指令!
注意:默认情况下,重写配置是不可继承的,也就是必须在每个需要使用重写引擎的虚拟主机中设置一个RewriteEngine on指令.
+----------------------------------------------------------------------------------------+
RewriteLock指令:
说明:设置RewriteMap同步使用的锁定文件名
语法:RewriteLock file-path
作用域:server config
状态:扩展(E)
模块:mod_rewrite
此指令设置mod_rewrite为了和RewriteMap程序通讯而使用的同步锁机制.在需要使用重写映射表程序(rewriting map-program)时,它必须是一个本地路径(而不能是一个NFS挂接设备).对其他类型的重写映射表,则无此要求.
+-----------------------------------------------------------------------------------------+
RewriteLog指令:
设置重写引擎日志的文件名:
语法:RewriteLog file-path
作用域:server config,virtual host
状态:扩展(E)
模块:mod_rewrite
RewriteLog指令设置用于记录所有重写操作的日志文件的名称.如果此文件名不以斜杠('/')开头,则它是相对于Server Root的.此指令应该在每个服务器级别配置中仅仅出现一次.
如果要关闭对重写操作的记录,不推荐将Filename设置为/dev/null,因为,虽然重写引擎不能输出记录了,但仍会在内部建立这个日志文件,这样会使服务器速度降低,而且对管理员毫无益处.要关闭日志,可以删除注释或注解RewriteLog指令,或者使用"RewriteLogLevel 0"的设置
RewriteLog "/usr/local/var/apache/logs/rewrite.log"
+-----------------------------------------------------------------------------------------+ |
|