首页 > 代码库 > Apache的Rewrite规则学习
Apache的Rewrite规则学习
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的
(httpd.conf)和目录级的(.htaccess) 两种方式。如果要想用到rewrite模块,必须先安装或加
载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,另一种是编译
apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。基于服务器级
的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打
开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说
明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则
virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在
.htaccess里要声明RewriteEngine on。2.字符含义介绍:
Rewrite标志
R[=code](force redirect) 强制外部重定向
G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
P(force proxy) 强制使用代理转发。
L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
N(next round) 重新从第一条规则开始运行重写过程。
C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过
T=MIME-type(force MIME type) 强制MIME类型
NS (used only if no internal sub-request) 只用于不是内部子请求
NC(no case) 不区分大小写
QSA(query string append) 追加请求字符串
NE(no URI escaping of output) 不在输出转义特殊字符
例如:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
S=num(skip next rule(s)) 跳过num条规则
E=VAR:VAL(set environment variable) 设置环境变量
Rewrite时服务器变量:
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT
connection & request: REMOTE_ADDR, QUERY_STRING
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL
system stuff: TIME_YEAR, TIME_MON, TIME_DAY
3.实际操作:
例子:RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。
例子:
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目录只能显示图片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>
在httpd-vhosts.conf中的写法如下:
RewriteRule ^/world/([\d]+)_([A-Z]+).html$ /world/index.php?c=world&a=houseDetail&houseId={$1}&housetype={$2} [L]
RewriteRule ^/pinggu/([a-z]+)/([0-9]+).html /pinggu/index.php?c=pinggu&a=detail&city=$1&newcode=$2&rewrite=1 [NC,NE]
RewriteRule ^/jiaju/([a-z]+)/jc_c([\d]+).html /jiaju/index.php?c=jiaju&a=buildList&city=$1&cid=$2
RewriteRule ^/esf_bs/([a-z]*)_?(\d*)_?b?(\d*)/?m?([0-9,]*)x?(\d*)a?([0-9,]*)c?(\d*)p?([0-9,]*)d?(\d*)/$ /esf/index.php?purpose=%B1%F0%CAFB&city=$1&district=$2&comarea=$3&price=$4&orderby=$5&area=$6&tags=$7&buildclass=$8&equipment=$9&rewrite
RewriteRule ^/world/([\d]+)_([A-Z]+).html$ /world/index.php?c=world&a=houseDetail&houseId={$1}&housetype={$2} [L]
#住宅rewrite规则
RewriteRule^/zf/([a-z]*)_?(\d*)_?(\d*)/?p?(\d*)h?(\d*)m?(\d*)c?(\d*)([a-z0-9]*)/$ $8&&purpose=&city=$1&district=$2&comarea=$3&price=$4&room=$5&rtype=$6&tags=$7 [C,NC]
RewriteRule^s?(\d*)r?(\d*)o?(\d*)f?(\d*)d?(\d*)p?x?(\d*)&&(.*) /zf/index.php?$7&housetype=$1&railway=$2&towards=$3&floor=$4&equipment=$5&orderby=$6&rewrite [QSA,L,NC]
#别墅rewrite规则
RewriteRule ^/zf_bs/([a-z]*)_?(\d*)_?(\d*)/?p?(\d*)t?(\d*)m?(\d*)s?(\d*)([a-z0-9]*)/?$ $8&&purpose=%B1%F0%CA%FB&city=$1&district=$2&comarea=$3&price=$4&buildclass=$5&rtype=$6&housetype=$7 [C,NC]
RewriteRule ^h?(\d*)o?(\d*)f?(\d*)d?(\d*)p?x?(\d*)&&(.*) /zf/index.php?$6&room=$1&towards=$2&floor=$3&equipment=$4&orderby=$5&rewrite [QSA,L,NC]
#写字楼rewrite规则
RewriteRule ^/zf_app_xzl/([a-z]*)_?(\d*)_?(\d*)/?p?(\d*)a?(\d*)t?(\d*)c?(\d*)r?(\d*)/? /zf/index.php?purpose=%D0%B4%D7%D6%C2%A5&app_type=app&city=$1&district=$2&comarea=$3&price=$4&area=$5&propertysubtype=$6&tags=$7&&railway=$8&rewrite [QSA,L]
#写字楼rewrite规则
RewriteRule ^/zf_xzl/([a-z]*)_?(\d*)_?(\d*)/?p?(\d*)a?(\d*)t?(\d*)c?(\d*)r?(\d*)/? /zf/index.php?purpose=%D0%B4%D7%D6%C2%A5&city=$1&district=$2&comarea=$3&price=$4&area=$5&propertysubtype=$6&tags=$7&&railway=$8&rewrite [QSA,L]
#写字楼rewrite规则
RewriteRule ^/zf_xzl/([a-z]*)_?(\d*)_?(\d*)/?p?(\d*)a?(\d*)t?(\d*)c?(\d*)r?(\d*)/? /zf/index.php?purpose=%D0%B4%D7%D6%C2%A5&city=$1&district=$2&comarea=$3&price=$4&area=$5&propertysubtype=$6&tags=$7&&railway=$8&rewrite [QSA,L]
RewriteRule ^/zf/([a-z]+)_xm([0-9]+)/$ /zf/index.php?c=zf&a=index&city=$1&projcodes=$2&src=http://www.mamicode.com/xiaoqu&rewrite [L]
Apache的Rewrite规则学习