Apache模块mod_rewrite

摘要
   mod_rewrite模块使用一个基于规则的重写引擎,基于PCRE正则表达式解析器,来动态的重写请求URLs。通常,mod_rewrite映射一个URL到一个问及那系统的路径。然而,他同样可以用来重定向一个URl到另一个URL,或者调用一个内部的代理获取。mod_rewrite提供了一个灵活强大的方式来操作URL,使用规则数目不限制。每个规则拥有数目不限的附属规则条件,可以是你通过基于服务变量,环境变量,HTTP头或者时间戳来重写URL。mod_rewrite对全URL路径进行操作,包括path-info部分。一个重写规则可以在httpd.conf中调用,或者在.htaccess中。重写规则产生的路径可以包括一个查询字符串,导致内部子处理,外部请求重定向,内部代理的吞吐量。
    日志
mod_rewrite提供了trace1到trace8日志级别的详细日志行为。日志级别可以被mod_rewrite的LogLevel指令特别设置。达到debug级别是,不记录行为,trace8表示记录所有行为。
     使用高的日志跟踪级别将大幅减慢Apache HTTP Server。使用高于trace2级别的日志水平只用于调试。
示例:
LogLevel alert rewrite:trace3
     RewriteLog
和早期mod_rewrite版本像是,可以查看RewriteLog和RewriteLogLevel指令。这一功能已经完全被上面提到的新的 per-module日志配置代替。获得mod_rewrite特定色日志消息,通过日志文件管道grep:
    tail -f error_log|fgrep '[rewrite:'
    RewriteBase 指令
Description:    Sets the base URL for per-directory rewrites
Syntax:    RewriteBase URL-path
Default:    None
Context:    directory, .htaccess
Override:    FileInfo
Status:    Extension
Module:    mod_rewrite
  RewriteBase指令指定了URL前缀,总目录(htaccess)RewriteRule指令用来替代相对路径。当你使用相对路径在上下文中代替总目录(htaccess)时,除非以下任何条件为真,该指令是必须的:
  •     源请求,代替在DocumentRoot下(和其他可到达的方式相对应,如Alias)。
  •     文件路径的目录包含RewiteRule,通过相关的替代添加后缀,而且是服务器上有效的到URL路径(这比较少见)。
  •    在Apache HTTP Server2.4.16及以后版本,该指令通过Alias、mod_userdir映射时可以省略。
在下面的例子中,RewriteBase对于避免重写到 http://example.com/opt/myapp-1.2.3/welcome.html是必须的,因为源没有和document root相关。这个配置错误通常造成服务寻找document root下面的“opt”目录。
DocumentRoot "/var/www/example.com"
AliasMatch "^/myapp" "/opt/myapp-1.2.3"
    RewriteEngine On
    RewriteBase "/myapp/"
    RewriteRule "^index\.html$"  "welcome.html"
RewriteCond指令
Description:    Defines a condition under which rewriting will take place
Syntax:    RewriteCond TestString CondPattern [flags]
Context:    server config, virtual host, directory, .htaccess
Override:    FileInfo
Status:    Extension
Module:    mod_rewrite
RewriteCond指令定义了一个规则限制。一个或多个RewriteCond可以放置在RewriteRule前面。当前URI的状况匹配他的模式并且这些条件都符合,以下规则才可以使用。
TestString是一个包括了下面扩展结构除了纯文本的字符串。
      RewriteRule反向引用:这些是固有的反向引用格式$N(0<=N<=9),$1到$9提供到该结构分组部分(在圆括号里)的访问。RewriteRule首当前的RewriteCond设置条件管控。0$提供整个匹配的字符串的访问。
     RewriteCond方向引用:    这些是固有的反向引用格式%N(0<=N<=9)  。1%到9%提供该结构(从当前条件设置中匹配的 最后一个RewriteCond)分组部分(同样是圆括号)的访问。%0提供整个匹配字符串的访问。
     RewriteMap扩展:扩展的固有格式${mapname:key|defaul}。查看 the documentation for RewriteMap获取更多细节。
     Server_variables:变量的固有格式%{NAME_OF_VARIABLE},NAME_OF_VARIABLE可以是以下列表的字符串:
HTTP headers: connection & request:  
HTTP_ACCEPT
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_REFERER
HTTP_USER_AGENT
AUTH_TYPE
CONN_REMOTE_ADDR
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT
IPV6
PATH_INFO
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_PORT
REMOTE_USER
REQUEST_METHOD
SCRIPT_FILENAME
 
server internals: date and time: specials:
DOCUMENT_ROOT
SCRIPT_GROUP
SCRIPT_USER
SERVER_ADDR
SERVER_ADMIN
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
CONN_REMOTE_ADDR
HTTPS
IS_SUBREQ
REMOTE_ADDR
REQUEST_FILENAME
REQUEST_SCHEME
REQUEST_URI
THE_REQUEST

这些变量与HTTP MIME-headers,Apache HTTP Server的C变量,Unix系统的tm字段结构这些相似的命名相符。大都文档在这里或是手册的其他地方或是CGI说明书!
SERVER_NAME和SERVER_PORT分别依赖于UseCanonicalName和UseCanonicalPhysicalPort的值。

你可能感兴趣的:(为了忘却)