您的位置:首页 > 运维架构 > Apache

Apache模块mod_rewrite

2017-01-04 09:47 489 查看
摘要
   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"
<Directory "/opt/myapp-1.2.3">
    RewriteEngine On
    RewriteBase "/myapp/"
    RewriteRule "^index\.html$"  "welcome.html"
</Directory>

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的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  apache rewrite