推荐给好友 上一篇 | 下一篇

Apache Rewrite 规则详解

E%}@"I4L1、Rewrite规则简介:BSD爱好者乐园ui.@"w/{+{ g Y!{

BSD爱好者乐园{K6Q/N|G2nx&AJ

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

B/|Y)oR0PL:C0cBSD爱好者乐园"z*r!V+MP_p:\)P

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。BSD爱好者乐园x)k0T;|[,}4g

r+n0wlj:pp基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

S&B%e$|"R#N-f O9X`BSD爱好者乐园9z] D {+\ tz`2l/[N

2、举例说明:

io$}3t4XhxBSD爱好者乐园_i\.ZRo {

下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和203.81.23.202都跳转到主机前缀为http://www.colorme.com.cn,避免当用户在地址栏写入http://colorme.com.cn时不能以会员方式登录网站。

Y/F sI*b G8vw

Jx2i9y'h%PANameVirtualHost 192.168.100.8:80BSD爱好者乐园4iM.FJs|lZ~

)E,w B n"g5P a#Y EmServerAdmin webmaster@colorme.com.cnBSD爱好者乐园4e.s%r0gC9G
DocumentRoot "/web/webapp"BSD爱好者乐园o"x;EZ1g&b
ServerName www.colorme.com.cnBSD爱好者乐园hVv oa2\v
ServerName colorme.com.cnBSD爱好者乐园&}&Z:v3}cg%ss+{ D
RewriteEngine on #打开rewirte功能
^J I,I:ugRewriteCond %{HTTP_HOST} !^www.colorme.com.cn [NC] #声明Client请求的主机中前缀不是www.colorme.com.cn,[NC]的意思是忽略大小写BSD爱好者乐园Et/O7O:h{T8s-U
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写BSD爱好者乐园lRJ*`\L+k.P0L5A8p
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写BSD爱好者乐园+|:V)Z+i1{,BN'f6Q_
RewriteRule ^/(.*) http://www.colorme.com.cn/ [L]BSD爱好者乐园6kozVw`m
#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.colorme.com.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。

+wvv-`'s{7iM5F

!G6_Z A1W*C
v!hzQp;L }例二.将输入 folio.test.com 的域名时跳转到profile.test.com

1u\#a$g+Kx

&A7t#h"Uj#gklisten 8080
z8W%m#x M)O _NameVirtualHost 10.122.89.106:8080BSD爱好者乐园(bzN6d)|/XLx&X4I
ServerAdmin webmaster@colorme.com.cn
-Fn4X&hs/WDocumentRoot "/usr/local/www/apache22/data1/"
sa{6j_&uServerName profile.test.comBSD爱好者乐园5l%e1{SR ^
RewriteEngine onBSD爱好者乐园p%s&bd)g9O_
RewriteCond %{HTTP_HOST} ^folio.test.com [NC]BSD爱好者乐园F(i#Hw8aL
RewriteRule ^/(.*) http://profile.test.com/ [L]

yg6w*X S_)w}

8R n1L"FG{s!n3.Apache mod_rewrite规则重写的标志一览BSD爱好者乐园;iP x6E#l\7L@

a6j_J kHz.^w2W1) R[=code](force redirect) 强制外部重定向BSD爱好者乐园f O{6JZ
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。BSD爱好者乐园!f8i:BuO(I
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
tq.e(J4Rnxp!^3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。BSD爱好者乐园2@)[ v ^Fao!@(|
4) P(force proxy) 强制使用代理转发。BSD爱好者乐园0O.A$JX:CdLQ,p
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。BSD爱好者乐园;q)qi}_ m ['M
6) N(next round) 重新从第一条规则开始运行重写过程。
kd)E-J)V7) C(chained with next rule) 与下一条规则关联

F\IF MUi;X

._ u:e4w Jd#Q%vN如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

ew?/V8p0pe+l&I

x^Kb;H8) T=MIME-type(force MIME type) 强制MIME类型
'wr'w8v:tJ V[@9) NS (used only if no internal sub-request) 只用于不是内部子请求BSD爱好者乐园L7R*w%k;Yq
10) NC(no case) 不区分大小写
T }+I4@fa-M!b\11) QSA(query string append) 追加请求字符串BSD爱好者乐园(X;}$m"Q+J
12) NE(no URI escaping of output) 不在输出转义特殊字符
'yW*U5{2\p W5nt+A例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
mJ.DS*cf2Q5g c13) PT(pass through to next handler) 传递给下一个处理
;Hk{C ]R N例如:
_h j"}V%Q!kl&s,?Q   RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理BSD爱好者乐园O Puc5U h%@
   Alias /def /ghi
(H-DKL1oX,V14) S=num(skip next rule(s)) 跳过num条规则
yz N Hx&U|15) E=VAR:VAL(set environment variable) 设置环境变量

6b;Vwn T-Xj

!oqII*Sz@i)a%R/D4.Apache rewrite例子集合BSD爱好者乐园e7T_s9wz;N-R p

BSD爱好者乐园P _!r\&nc

   在 httpd 中将一个域名转发到另一个域名虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://www.webhosting-world.com/forums/-f60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。BSD爱好者乐园:Pq$W0B0B s v

BSD爱好者乐园];X7jJbM/I3Z2| |

在中添加下面的重定向规则:BSD爱好者乐园2X}G)k8i?+Fj

,x fL9rto"d:pRewriteEngine OnBSD爱好者乐园1N l f^&M
# Redirect webhosting-world.com/forums to bbs.wbhw.com
ElP9I\:N7fJRewriteCond %{REQUEST_URI} ^/forums/BSD爱好者乐园CF}7J8LO [
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
uq}wNQ)p# Redirect webhosting-world.com to wbhw.comBSD爱好者乐园,?}|!N9S1b5rF
RewriteCond %{REQUEST_URI} !^/forums/BSD爱好者乐园"| _}I#M(q` s
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]BSD爱好者乐园2v _#}1a&?Z:d2n

BSD爱好者乐园 ~#TC*F"}&E`dTX

添加了上面的规则以后, 里的全部内容如下:BSD爱好者乐园0b'@"`T lR{T

+}c R?J\D#\*A"S0xServerAlias webhosting-world.comBSD爱好者乐园/| rR+r+OL(]
ServerAdmin admin@webhosting-world.comBSD爱好者乐园)A {/H,b5EO){*|&RB
DocumentRoot /path/to/webhosting-world/rootBSD爱好者乐园8d0R.GiM Q1E
ServerName www.webhosting-world.comBSD爱好者乐园3dmK#] Q9i
RewriteEngine OnBSD爱好者乐园%p.U"T+nB+b
# Redirect webhosting-world.com/forums to bbs.wbhw.comBSD爱好者乐园vZ,^x0I.a{
RewriteCond %{REQUEST_URI} ^/forums/BSD爱好者乐园e:Ron;Zt-_y
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
!_:[ohfDvq4\# Redirect webhosting-world.com to wbhw.com
T@3w;e9sZ _RewriteCond %{REQUEST_URI} !^/forums/BSD爱好者乐园U \L A$g/Nv
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

V,^8Gn!S

s:u-m Dq7U/tJCQURL重定向BSD爱好者乐园$s~^I0l+e

5ePgw6@^GFq例子一:BSD爱好者乐园b't9Pi/z!k3H$G

YD I3o},y#IcA1.http://www.zzz.com/xxx.php-> http://www.zzz.com/xxx/BSD爱好者乐园}&V?Q!lz~
2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能BSD爱好者乐园3H2sWl@RI
RewriteEngine On
T[(PMz&dp iRewriteCond %{HTTP_HOST} ^www.zzz.comBSD爱好者乐园/Z1x-P7B Aln
RewriteCond %{REQUEST_URI} !^user\.php$
n\1qR S W,h;ZRewriteCond %{REQUEST_URI} \.php$BSD爱好者乐园%e4R|$~1^d6q{
RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R]
/it2}@YuW;lhRewriteCond %{HTTP_HOST} !^www.zzz.comBSD爱好者乐园~z]N3]s:w-xbl
RewriteRule ^(.+) %{HTTP_HOST} [C]BSD爱好者乐园 ?/DMmHn#K:~
RewriteRule ^([^\.]+)\.zzz\.com http://www.zzz.com/user.php?username=$1BSD爱好者乐园+],{)h5zqs(Z

BSD爱好者乐园B|e\ Z7|e!]z

例子二:

:pd-P*\_\Ph^BSD爱好者乐园(FGXpL{/[c

/type.php?typeid=*   --> /type*.htmlBSD爱好者乐园iJ6`-x L-[}
/type.php?typeid=*&page=*   --> /type*page*.htmlBSD爱好者乐园K(? w{-?(Ua w2hi
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
3rbaA#G!eoRewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]

&A Rm{!Oj GQ1{#B

;O:[s%u+G&ORd5.使用Apache的URL Rewrite配置多用户虚拟服务器

O2L%Tn4D Nyj

v0irF[}`ti   要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的这台Linux Server上。

6h!e)Z2Z!{dBSD爱好者乐园$U Q'cjo4T

然后,看一下我的Apache中关于*.semcase.com的虚拟主机的设定。BSD爱好者乐园/Z^8b,U ?8cx*W

p3op;q"S.\;m3M#*.com,*.osall.netBSD爱好者乐园De!s-GCQ]

Z*]`7N,rServerAdmin webmaster@semcase.comBSD爱好者乐园$avRP2C
DocumentRoot /home/www/www.semcase.com
ma\:G} D n.ou iServerName dns.semcase.comBSD爱好者乐园Y9K5eGY
ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net
]3l(["D3^bhCustomLog /var/log/httpd/osa/access_log.log" common
yHpk$@    ErrorLog /var/log/httpd/osa/error_log.log"
6{ V6wHEG~Q:S LAllowOverride None
+W/T v,k _a{_Order deny,allowBSD爱好者乐园6A(zE2@W A(J
#AddDefaultCharset GB2312   BSD爱好者乐园k#z%gJ8v
  
{#q;p-p9bT;re6c/X     BSD爱好者乐园bl1z ^VP6M-L
RewriteEngine on      BSD爱好者乐园 yK@0c9o X bq|
RewriteCond %{HTTP_HOST}        ^[^.]+\.osall\.(com|net)$      BSD爱好者乐园y}\.K(N5{s
RewriteRule ^(.+)     %{HTTP_HOST}$1   [C]      BSD爱好者乐园:??2VPOIu'e2N o
RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$BSD爱好者乐园oKH v$vk'fI6k{
/home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]BSD爱好者乐园,g1]x!eu"ZzJ

mt O&?U'B0sl}
?c3l:[S-`#H3r Du在这段设定中,我把*.semcase.net和*.semcase.com 的Document Root都设定到了 /home/www/www.semcase.comBSD爱好者乐园t~ed;Lh9S@

k{0CK-@8NuX_但是,继续看下去,看到...配置了吗?在这里我就配置了URL Rewrite规则。BSD爱好者乐园tO_0Y&e/G
RewriteEngine on #打开URL Rewrite功能
T9Y3] }"JG~_RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.semcase.com 或者 xxxx.semcase.cn 就执行下面一句
*m4P|1@mRewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思BSD爱好者乐园(sn(T+] z2z'f#]
RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]BSD爱好者乐园 `+h y5R9DK9[
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www /dev.semcase.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。BSD爱好者乐园(ZPyXF

BSD爱好者乐园_.|7Hm\`

这样设置后,重启Apache服务器,测试一下,就大功告成了!

a,t)a)J|C*V(Zu
[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: Apache apache APACHE rewrite
 

评分:0

我来说两句

seccode