delta 2008-2-16 18:56
url重写apache rewrite全攻略
ReWrite可以应用在以下方面或者解决以下问题:)X)B;k;P.]&Sk
URL的规划
L6R"C+X7O(q9X2x
规范的URL
$S[%L"J"eVqq&h"w_2e
说明:
R~/L1NZL!DZ
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
@?.ba
GN
M|Yq$XR{
说明:
lz j)Ys@HN
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
FS:m\#s
t
u]y,QjWc9C7~
方案:
km3E)zEf+n9x
对所有的不规范的URL执行一个外部的HTTP重定向,以改变它在浏览器地址栏中的显示及其后继的请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀的斜杠。 k"dW$F;V}z
0a#PSy O+F9sn9{
代码:
t&w5d{Z:N7z3t
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]9cI(Sv[2r%H o
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]y.dBT+@l4{
&H^.k3B4X^IM6[
规范的主机名8h6HpaR1f
说明:0`!f(t iG(U
[um
…
[;j6w2iFT9`:Q
方案:
r7xG.y3s
代码:9q2I0zc'uQG)J
RewriteCond % !^fully.qualified.domain.name [NC]
WF-{
j-? ]y@5qB
RewriteCond % !^$
n*FAUv)w~\1?V+l?2@
RewriteCond % !^80$^[B A0i
RewriteRule ^/(.*) [url]http://fully.qualified.domain.name:%/[/url]$1 [L,R]
:].ay[y`
RewriteCond % !^fully.qualified.domain.name [NC]+ltT$on5]w
RewriteCond % !^$6~"@
W(J{q!n.R
RewriteRule ^/(.*) [url]http://fully.qualified.domain.name/[/url]$1 [L,R]] u%P_4J$f
.i E$QD+`4~2k9Z
被移动过的DocumentRoot
K"foyv^"s
说明:&`[["G\0c6b
通常,网站服务器的DocumentRoot直接对应于URL”/”,但是,它常常不是处于最高一级,而可能只是众多数据池中的一个实体。比如,在Intranet站点中,有/e/www/(WWW的主页)、/e/sww/ (Intranet的主页)等等,而DocumentRoot指向了/e/www/,则必须保证此数据池中的所有内嵌的图片和其他元素对后继请求有效。
5u'?9v%A$g:@I
~5H#S&I7q5p1zY
方案:5nQrVf/Ei VC q
只须重定向URL /到/e/www/即可。这个方案看起来很简单,但只是有了mod_rewrite模块的支持,它才简单,因为传统的URL Aliases机制(由mod_alias及其相关模块提供)只是作了一个前缀匹配,DocumentRoot是一个对所有URL的前缀,因而无法实现这样的重定向。而用mod_rewrite的确很简单: T,U9jPE$Rq&b4_
'w#l
O:T9uc8V!OD
代码:
8X,D(N_o3aBu
ul
RewriteEngine onm`8p3of%`%Cw&o'E
RewriteRule ^/$ /e/www/ [R] C3IR.t9{
K,KoJ
'H
_5_)Z
H1c7y9t*J
后缀斜杠的问题
sjr%g Y)\YR"dD
说明:^;~t4@q~G!B
每个网管对引用目录后缀斜杠的问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是/~quux/foo而不是/~quux/foo/,服务器会去找一个叫foo的文件,而它是一个目录,所以就报错了。事实上,大多数情况下,它自己会试图修正这个错误,但是有时候需要你手工纠正,比如,在重写了许多CGI脚本中的复杂的URL以后。
/m T)?B{1lp\
Nd%oL~n1Kcu
方案:
._f3K9IE
解决这个微妙问题的方案是让服务器自动添加后缀的斜杠。对此,必须使用一个外部的重定向,使浏览器正确地处理后继的对诸如图片的请求。如果仅仅作一个内部的重写,可能只对目录页面有效,而对内嵌有使用相对URL的图片的页面则无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,/~quux/foo/index.html页面中对image.gif的请求,其结果将是/~quux/image.gif!。
x9~z'DJ?zzbm
X
`$P/j.H,G6T
所以,应该这样写:*P
xU+n3NN%lF~
}7Sf"E/|2N
代码:Du?[
E)SR
|9~C
RewriteEngine on
)^(r\
g&\h1m
RewriteBase /~quux//X n Z`R[3F
RewriteRule ^foo$ foo/ [R] ZvJXE:YEA-W8t
WRda
_ Y
又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中,但是须注意,如此会带来一些处理上的开销。
s8I
zn BQ h$K ? Sc_y_
\)dD-]a'U
代码:O3E[c
EVy1{e
RewriteEngine on9g*n&Si%hZ~![V1V
RewriteBase /~quux/
5{3t2vj5\woT)~
RewriteCond % -d,sI1l\@
RewriteRule ^(.+[^/])$ $1/ [R]
-O)S8\Hcee&W
A7vE.z.\x
集群网站的同类URL规划.T|hC l
\YH
说明:-X/i _H`\(D
我们希望在一个Intranet集群网站中,对所有WWW服务器建立一个同类的一致性的URL规划,也就是,所有的URL(对单个服务器来说,是本地的依赖于此服务器的!)是独立于服务器的!我们需要的是一个具有独立于服务器的一致性规划的WWW名称空间,即,URL不需要包含正确的物理的目标服务器,而由集群本身来自动定位物理的目标主机。
ye_{'?:D(Su(qc
2}PX"\8i'|8DMW
方案:+Oz?G-GT(C
首先,目标服务器的信息来自(产生)于包含有用户、组以及实体的外部地图,其格式形如:gkq"L|,W"t
M6G8MM x"M
代码:
_;bZF4Ug"|
user1 server_of_user1
(n-uyV ?bo
user2 server_of_user2
3RO\6PkBdw
: :
(?P;ww~7_
YZ
t3ae+Z)g
Ki/W!@,v
这些信息被存入map.xxx-to-host文件。其次,如果URL在一个服务器上无效,需要引导所有的服务器重定向URL*j%KB\A/c-l(E@{,U7Q
4b+qmzo(Bp
代码:(kWM$F]pd8c
/u/user/anypath
F.b-ML2LHuafFE
/g/group/anypath
$@(op?'U'x(J R@
/e/entity/anypath
7n)e0M,[
~B#Q8PCy
5~n+|OTr
到
Pc t+fsf,~,U