modrewrite配置文档学习笔记:

1.环境变量:

例子:

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/

2:RewriteBase
描述:设定基于目录的重写规则的Base url.
Syntax: RewriteBase URL-path
Context: directory, .htaccess
Override: FileInfo
Status: Extension
Module: mod_rewrite
这个一般不太需要管它.
3.RewriteCond
用法: RewriteCond Teststring Pattern
这里是Teststring里用到的一些内置变量.
HTTP headers: connection & request:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

DOCUMENT\_ROOT
SERVER\_ADMIN
SERVER\_NAME
SERVER\_ADDR
SERVER\_PORT
SERVER\_PROTOCOL
SERVER\_SOFTWARE
TIME\_YEAR
TIME\_MON
TIME\_DAY
TIME\_HOUR
TIME\_MIN
TIME\_SEC
TIME\_WDAY
TIME
API\_VERSION
THE\_REQUEST
REQUEST\_URI
REQUEST\_FILENAME
IS\_SUBREQ
HTTPS


#你可以在规则前加"!"取反.
#这是一些常见的特殊的规则。你可以使用他们来取代一些表达式:

\* 'CondPattern' (lexicographically follows)
\* '=CondPattern' (lexicographically equal)
\* '-d' (is directory)  测试是否是目录.
\* '-f' (is regular file) 测试是否是常规文件.
\* '-s' (is regular file, with size)
\* '-l' (is symbolic link)
\* '-F' (is existing file, via subrequest)
\* '-U' (is existing URL, via subrequest)

你可以为规则后设置\[flags\]选项作为第三个参数.常见的有:
You can also set special flags for CondPattern by appending \[flags\]  as the third argument to the RewriteCond  directive, where flags is a comma-separated list of any of the following flags:

# 'nocase|NC' (no case)
# 'ornext|OR' (or next condition)
例如:
RewriteCond %{REMOTE\_HOST}  ^host1.\*  \[OR\]
RewriteCond %{REMOTE\_HOST}  ^host2.\*  \[OR\]
RewriteCond %{REMOTE\_HOST}  ^host3.\*
RewriteRule ...some special stuff for any of these hosts...

如下例:
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类的浏览器访问时会带你到homepage.max.html,这里支持所有特性。用Lynx来浏览时,带你到纯文本页(homepage.min.html),默认情况下会访问一个叫homepage.std.html的页.

4.RewriteEngine:
使用:
RewriteEngine On|Off
如果存在.htaccess的文件,应当显式地指明RewriteEngine On.
因为默认情况下.htaccess的RewriteEngine项是Off的。因此如果想用.htaccess来设置rewrite,文件头一行一般都需要RewriteEngine On

5.RewriteLock:
供rewrite-mapping程序同步使用的锁文件。
使用:
RewriteLock file-path

6.RewriteLog:
设定日志文件.如果不是以”/“开头,则是指相对ServerRoot的相对路径.
使用:
RewriteLog file-path

7.RewriteLogLevel:
设定日志记录级别。
使用:
RewriteLogLevel level
默认:

8.RewriteMap:
使用Mapping.
它的上下文是Server config 和Virtual host
使用:
RewriteMap Mapname MapType:Mapsource
例如:
在httpd.conf中配置:
#RewriteMap exampleMap txt:/path/to/file/map.txt
#RewriteRule ^/ex/(.*) ${exampleMap:$1}
而map文件的格式有这个几个:
1.txt类型的map文件:
#Standard Plain txt:
#map.txt
#maptype:txt
Ralf.S.Engelschall rse # Bastard Operator From Hell
Mr.Joe.Average joe # Mr. Average

2.Randomized Plain Text
    #maptyp:rnd
    static    www1|www2|www3|www4
    dynamic    www5|www6

    配置:
    RewriteMap servers    rnd:/path/to/mapfile/map.txt
    RewriteRule ^/(.\*.(png|gif|jpg)) http://${servers:static}/$1    \[NC,P,L\]
    RewriteRule ^/(.\*)    http://${servers:dynamic}/$1    \[P,L\]

3.dbm
    这里提供了一个txt2dmb程序。
    !/path/to/bin/perl
    ##
    ##  txt2dbm -- convert txt map to dbm format
    ##

    use NDBM\_File;
    use Fcntl;

    ($txtmap, $dbmmap) = @ARGV;

    open(TXT, "<$txtmap") or die "Couldn't open $txtmap!n";
    tie (%DB, 'NDBM\_File', $dbmmap,O\_RDWR|O\_TRUNC|O\_CREAT, 0644)
      or die "Couldn't create $dbmmap!n";

    while () {
      next if (/^s\*#/ or /^s\*$/);
      $DB{$1} = $2 if (/^s\*(S+)s+(S+)/);
    }

    untie %DB;
    close(TXT);

    用法:
    $ txt2dbm map.txt map.db

4.内置函数:
    map:int map-source:internal apache functions
    functions有:toupper,tolower,escape,unescape

5.外部程序:
    maptyp:prg map source:外部程序的路径.
    示例:
    #!/usr/bin/perl
    $| = 1;
    while () {
        # ...put here any transformations or lookups...
        print $\_;
    }

9.RewriteOptions
用法:
RewriteOptions rewriteoptions
default :
rewriteoptions maxRedirects=10
上下文:
server config,virtual host,.htaccess directory
rewriteoptions可以是下面两个值:
inherit:从上一级配置继承.
MaxRedirects=num(10,15,,,,,等等)

10.RewriteRule:
这是mod_rewrite中用得最多的语句了(“the real rewriting workhorse”);
用法:
RewriteRule pattern Substitution [Flags]

Quantifiers:
  ?           0 or 1 occurrences of the preceding text
  \*           0 or N occurrences of the preceding text (N > 0)
  +           1 or N occurrences of the preceding text (N > 1)

Grouping:
  (text)      Grouping of text
              (used either to set the borders of an alternative as above, or
              to make backreferences, where the Nth group can
              be referred to on the RHS of a RewriteRule as $N)

Anchors:
  ^           Start-of-line anchor
  $           End-of-line anchor

Escaping:
  char       escape the given char
              (for instance, to specify the chars ".\[\]()" etc.)

一些技巧:
  1. back-references ($N) to the RewriteRule pattern
  2. back-references (%N) to the last matched RewriteCond pattern
  3. server-variables as in rule condition test-strings (%{VARNAME})
  4. mapping-function calls (${mapname:key|default})
关于Flags:
# 'chain|C' (chained with next rule)
# 'cookie|CO=NAME:VAL:domain\[:lifetime\[:path\]\]' (set cookie)
# 'env|E=VAR:VAL' (set environment variable)
# 'forbidden|F' (force URL to be forbidden)
# 'gone|G' (force URL to be gone)
# 'last|L' (last rule)
# 'next|N' (next round)
# 'nocase|NC' (no case)
# 'noescape|NE' (no URI escaping of output)
例如:
RewriteRule /foo/(.\*) /bar?arg=P1%3d$1 \[R,NE\]
这将会将'/foo/zed' 转向到'/bar?arg=p1=zed'
# 'nosubreq|NS' ( not for internal sub-requests)
# 'proxy|P' (force proxy)

Note: mod\_proxy must be enabled in order to use this flag.
# 'passthrough|PT' (pass through to next handler)
(例如:
RewriteRule ^/abc(.\*) /def$1 \[PT\]
Alias /def /ghi

# 'qsappend|QSA' (query string append)
# 'redirect|R \[=code\]' (force redirect)
# 'skip|S=num' (skip next rule(s))
# 'type|T=MIME-type' (force MIME type)