超神之黑暗君主免费:Apache Rewrite知识汇总贴

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 04:26:08

一、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:以下是实例说明:tbqu.com,115.47.151.223 为前缀的跳转到 www.tbqu.com
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^tbqu.com [NC] #声明Client请求的主机中前缀不是tbqu.com,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^115.47.151.223 [NC] #声明Client请求的主机中前缀不是115.47.151.223,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
RewriteRule ^/(.*) http://www.tbqu.com/ [L]
#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.colorme.com.cn/,
[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便
于后面的应用.就是引用前面里的(.*)字符。
2: http://www.webhosting-world.com/forums/-f60.html => http://bbs.wbhw.com/-f60.html
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
3:http://www.zzz.com/xxx.php->; http://www.zzz.com/xxx/ 和 http://yyy.zzz.com->http://www.zzz.com/user.php?username=yyy
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user\.php$
RewriteCond %{REQUEST_URI} \.php$
RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^\.]+)\.zzz\.com http://www.zzz.com/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]