一、apache rewrite 服务器变量 引用方法:%{ NAME_OF_VARIABLE }
HTTP headers 部分: HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT connection & request 部分: REMOTE_ADDR REMOTE_HOST REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE server internals部分: DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE system stuff 部分: TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME specials部分: API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ 特别注意事项: 1:SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的,即,Apache服务器的内部request_rec结构中的 filename字段。 第一个其实就是大家都知道的CGI变量名,而第二个则是(包含了request_rec结构中的uri字段的)REQUEST_URI的一个副本, 2:特殊形式: %{ENV:variable} 其中的variable可以是任何环境变量。 它是通过查找Apache内部结构得到的, 或者(如果没找到的话)是由Apache服务器进程通过getenv()得到的。 3:特殊形式: %{HTTP:header} 其中的header可以是任何HTTP MIME头的名称。 它是通过查找HTTP请求得到的。比如: %{HTTP:Proxy-Connection}就是HTTP头 “Proxy-Connection:”的值. 4:特殊形式 %{LA-U:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于URL的)子请求后决定。在重写需要使用一个尚未有效的但是会在之后的API程序段中设置的变量的时候,就会使用这个方法。比如,需要在服务器级配置(httpd.conf文件)中重写REMOTE_USER变量,则,必须使用%{LA- U:REMOTE_USER},因为此变量是由认证程序段设置的,而这个程序段是在mod_rewrite所在的URL转译程序段之后才执行的。但是,因为mod_rewrite是通过API修正程序段来实现目录级(.htaccess file)配置的,而这个程序段在认证程序段之前就执行了,所以用%{REMOTE_USER}就可以了。 5:特殊形式: %{LA-F:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的LA-U是相同的.
二、apache rewrite 正则表达式的说明 . 匹配任何单字符 [chars] 匹配字符串:chars [^chars] 不匹配字符串:chars text1|text2 可选择的字符串:text1或text2 匹配0到1个字符 * 匹配0到多个字符 + 匹配1到多个字符 ^ 字符串开始标志 $ 字符串结束标志 \n 转义符标志 反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9) 反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)
三、apache rewrite 规则后面的标志符说明 1:RewriteCond标志符 nocase|NC (no case)忽略大小 ornext|OR (or next condition)逻辑或,可以同时匹配多个RewriteCond条件 2:RewriteRule适用的标志符 redirect|R [=code] (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L] forbidden|F (force URL to be forbidden)重写为禁止访问 proxy|P (force proxy)重写为通过代理访问的http路径 last|L (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则 next|N (next round)循环同一个规则,直到不能满足匹配 chain|C (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。 type|T=MIME-type (force MIME type)指定MIME类型 nosubreq|NS (used only if no internal sub-request)如果是内部子请求则跳过 nocase|NC (no case)忽略大小 qsappend|QSA (query string append)附加查询字符串 noescape|NE (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。 passthrough|PT (pass through to next handler)将重写结果运用于mod_alias skip|S=num (skip next rule(s))跳过下面几个规则 env|E=VAR:VAL (set environment variable)添加环境变
四,Apache Rewrite 一些实例 打开apache rewrite 包括两种情况 1:在httpd.conf全局中打开 RewriteEngine on 2: 局部里利用RewriteEngine on来打开rewrite功能 3: 基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
1:以下是实例说明:,115.47.151.223 为前缀的跳转到 www. RewriteEngine on #打开rewirte功能 RewriteCond %{HTTP_HOST} !^ [NC] #声明Client请求的主机中前缀不是,[NC]的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^115.47.151.223 [NC] #声明Client请求的主机中前缀不是115.47.151.223,[NC]的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写 RewriteRule ^/(.*) http://www./ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www./, [L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便 于后面的应用.就是引用前面里的(.*)字符。 2: http://www./forums/-f60.html => http://bbs./-f60.html RewriteEngine On # Redirect /forums to bbs. RewriteCond %{REQUEST_URI} ^/forums/ RewriteRule /forums/(.*) http://bbs./$1 [R=permanent,L] # Redirect to RewriteCond %{REQUEST_URI} !^/forums/ RewriteRule /(.*) http://www./$1 [R=permanent,L] 3:http://www./xxx.php->; http://www./xxx/ 和 http://yyy.->http://www./user.php?username=yyy RewriteEngine On RewriteCond %{HTTP_HOST} ^www. RewriteCond %{REQUEST_URI} !^user\.php$ RewriteCond %{REQUEST_URI} \.php$ RewriteRule (.*)\.php$ http://www./$1/ [R] RewriteCond %{HTTP_HOST} !^www. RewriteRule ^(.+) %{HTTP_HOST} [C] RewriteRule ^([^\.]+)\.zzz\.com http://www./user.php?username=$1 4:/type.php?typeid=* ?> /type*.html 和 /type.php?typeid=*&page=* ?> /type*page*.html RewriteEngine On RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT] RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT] 5:泛域名,二级域名虚拟服务器 RewriteEngine on RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.semcase.com 或者 xxxx.semcase.cn 就执行下面一句 RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思 RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L] # 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给 /home/www/dev.semcase.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则) 6:浏览器为IE和Opera的访客将被禁止访问 ewriteEngine on!?S5IG LOj RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]_R N/7\ RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]!&’ # a RewriteRule ^.* - [F,L] 这里”-”表示没有替换。 7:限制目录只能显示图片 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$ RewriteRule .*$ - [F,L]
|