URL重写简介
本篇文档是mod_rewrite
参考文档的补充,阐述了使用mod_rewrite
之前必须了解的基本概念。其它文档则作了更加深入的探讨。不过这篇文档对于初学者是一篇很好的入门读物。
简介
Apache的mod_rewrite
是提供了强大URL操作的杀手级模块,可以实现几乎所有你梦想的URL操作,其代价是你必须接受其复杂性,因为mod_rewrite
对于初学者的主要障碍就是不容易理解和运用,即使是Apache专家有时也会发掘出mod_rewrite
的新用途。换句话说:你或者是打退堂鼓永不再用,或者是喜欢它并一生受用。目前存在这样一种倾向:许多初学者只是把URL重写规则当着是会变戏法的魔咒,而并未在使用中真正理解这些规则的含义。
本篇文档试图给出充分的背景知识,以便于初学者随后的理解,而不是盲目的复制和粘贴。
正则表达式
mod_rewrite
使用的是Perl兼容的正则表达式语法。本文不打算详细讲解正则表达式语法,你可以到PCRE man page, Perl regular expression man page, Mastering Regular Expressions, by Jeffrey Friedl获得这些内容。
RewriteRule
指令的说明部分有一个简单的正则表达式语法简介,可以去参考一下。
另外需要说明的是可以在表达式的最前面加上一个感叹号('!')表示不匹配,不过这种用法并不符合正则表达式语法。
正则表达式的反向引用能力
这是很重要的一点:一旦在Pattern或者CondPattern中使用了圆括号,就会建立内部的反向引用,可以使用$N
和%N
来调用(见下述),并且在Substitution和TestString中都有效。图-2说明了反向引用被转换和展开的位置。
图-2: The back-reference flow through a rule.
RewriteRule basics
(此部分文档尚未完成) Basic anatomy of a RewriteRule, with exhaustively annotated simple examples.
Rewrite Flags
(此部分文档尚未完成) Discussion of the flags to RewriteRule, and when and why one might use them.
Rewrite conditions
(此部分文档尚未完成) Discussion of RewriteCond, looping, and other related concepts.
Rewrite maps
(此部分文档尚未完成) Discussion of RewriteMap, including simple, but heavily annotated, examples.
.htaccess files
(此部分文档尚未完成) Discussion of the differences between rewrite rules in httpd.conf and in .htaccess files.
环境变量
此模块会跟踪两个额外的(非标准)CGI/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/