查ip查手机 | 身份证验证 | 在线翻译 | 简繁转换 | 天气预报 | 邮编区号 | 火车时刻 | 飞机航班 | 世界时间 | 阴阳万年历
度衡量 | 实时汇率 | Alexa排名 | PR值查询 | 域名查询 | 住房贷款计算 | 搜索引擎收录 | 实用网址 | 友情链接

查看完整版本: url重写apache rewrite全攻略

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 |Y q$XR { 说明:
lz j)Y s@HN 在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
FS:m\#s
t u ]y,Qj Wc9C7~ 方案:
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%Ho
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]y.dBT+@l4{

&H^.k3B4X ^IM6[ 规范的主机名8h6H p aR1f
说明:0`!f(t i G(U [u m

[;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 VCq
只须重定向URL /到/e/www/即可。这个方案看起来很简单,但只是有了mod_rewrite模块的支持,它才简单,因为传统的URL Aliases机制(由mod_alias及其相关模块提供)只是作了一个前缀匹配,DocumentRoot是一个对所有URL的前缀,因而无法实现这样的重定向。而用mod_rewrite的确很简单: T,U9jPE$R q&b4_

'w#l O:T9uc8V!OD 代码:
8X,D(N_o3aBu ul RewriteEngine onm`8p3o f%`%Cw&o'E
RewriteRule ^/$ /e/www/ [R] C3IR.t9{ K,K oJ

'H _5_)Z H1c7y9t*J 后缀斜杠的问题
sjr%gY)\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] Zv JXE:YE A-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
A7v E.z.\x 集群网站的同类URL规划.T|hCl \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

M6G8MMx"M 代码:
_;bZF4Ug"| user1 server_of_user1
(n-uyV ?bo user2 server_of_user2
3RO\6PkB dw : :
(?P;w w~7_ YZ
t3ae+Z)g Ki/W!@,v 这些信息被存入map.xxx-to-host文件。其次,如果URL在一个服务器上无效,需要引导所有的服务器重定向URL*j%KB\A/c-l(E@{,U7Q
4b+qmz o(Bp
代码:(kWM$F]pd8c
/u/user/anypath
F.b-ML2LHu afFE /g/group/anypath
$@(op?'U'x(JR@ /e/entity/anypath
7n)e0M,[ ~B#Q8PC y
5~n+|OTr
Pc t+fsf,~,U mr"}VX/Jf'R)k-j
代码:
_mqR7FT+_:Q http://physical-host/u/user/anypathl[&S!Ir"E4T'o"F
http://physical-host/g/group/anypath
1z nuT ? http://physical-host/e/entity/anypath9Q1j2|.}}/dG

(g&E.k0\R-?U 以下规则集依靠地图文件来完成这个操作(假定,如果一个用户在地图中没有对应的项,则使用server0为默认服务器):U6L&f`| N6kO1ogS4?

2AOZ X` 代码:
V1l?!lyeP RewriteEngine on3H1y:p/{](f!`2^
hu0BV.y(N8H4^ {
RewriteMap user-to-host txt:/path/to/map.user-to-host7J |`CV,Z/~(J
RewriteMap group-to-host txt:/path/to/map.group-to-host
(Q0i-_ Sc#BFO ? RewriteMap entity-to-host txt:/path/to/map.entity-to-host eb r4D,V#w9J8H5Hd

~)? zH ?c.ES RewriteRule ^/u/([^/]+)/?(.*) http://$/u/$1/$2o$tLUu%n I
RewriteRule ^/g/([^/]+)/?(.*) http://$/g/$1/$2
5]Z7E-t,i_ MWY RewriteRule ^/e/([^/]+)/?(.*) http://$/e/$1/$2SG b1mh)c
| G q:UO]1{,E Ls
RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/
3Ie%t\7H Q%k.gDu RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3
EVH`n*wl
D$s'E'S5Nx7Ok 移动宿主目录到不同的网站服务器
3`1NJ6Fn~ TyF 说明:
J0cTTV1uLb 通常,许多网管在建立一个新的网站服务器时,都会有这样的要求:重定向一个网站服务器上的所有宿主目录到另一个网站服务器。^{5HNt!K"Lq${$W0E
"Opi*{H'{+_
方案:!cc&h*a{D.a}
很简单,用mod_rewrite。在老的网站服务器上重定向所有的URL /~user/anypath到http://newserver/~user/anypath。
r {;u,i bmqi"o
Hh*xgV 代码:4P]M.`u'c
RewriteEngine on
O^*K0jxV r6EWz RewriteRule ^/~(.+) http://newserver/~$1 [R,L]
J/Xn"D,X S6~ A
pG)[l+[:l0V$j 结构化的宿主目录:LK%m$r&^u]9~ b
说明:"X:Q#TN$A:Q-e&H/r;_
一些拥有几千个用户的网站通常都使用结构化的宿主目录规划,即,每个宿主目录位于一个带有特定前缀比如其用户名的第一个字符的子目录下。那么,/~foo/anypath代表/home/f/foo/.www/anypath,而/~bar/anypath代表/home/b/bar/.www/anypath。'bG)CZ D!F

9dy$C(i am)\ 方案:
}yl#@1yST 可以使用下列规则集来扩展~以达到上述目的。
a+M,t)|-mK&]/`fk#`
5@[+wz#I:t\ 代码:9tg;zs8oVFe
RewriteEngine on/eO.U8w9zt qr7H
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3Y"|7v{0K2Gqxq/o

}G A_/_:p0y 文件系统的重组9LpFY6Xe|Cam
说明:
2D`+h:F%a4V 这是一个不加雕琢的例子:一个大量使用针对目录的规则集以实现平滑观感,而从来不用调整数据结构的杀手级的应用。背景:net.sw从1992年开始,存放了我收集的免费的有效的Unix软件包。它是我的爱好也是我的工作,因为在学习计算机科学的同时,业余时间还做了多年的系统和网络的管理员。每周我都需要整理软件,因而建立了一个层次很深的目录结构来存放各种软件包:
Lk%I e+\R y^3u'lr .aT"P'`4l-_fa
代码:
T_)BO {"V drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/5o JE9mmD
drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/Q'j(B8G$t9|Esv
drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/u+D3JH&u"NC4?G
drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/:Zv'M~k;~&M|\|
drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/
G?Z'`F9yi drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/;f1D8EUvB Ql
drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/e Io?;w-]
drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/t:z&u%r,V#i
drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/w [gQ@;Dg
drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/1e:s9D(aD`}b n
drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/-nE zv-Z,mq
drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/d K3B4Q` FC"x@
drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/$g8z6S&z,w1uC*u
drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/
8{y$[bT ^/NPB drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/7|#xD7c2@
drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/
7Z2IQ%TZ8O1B 5C7R^D+T:`Q'}[z{
1996年7月,我决定通过一个漂亮的Web接口公开我的收藏。“漂亮”是指提供一个接口以直接浏览整个目录结构,同时不对这个结构做任何改变 - 甚至也不在结构顶部放置CGI脚本。为什么呢?因为这个结构还要能够被FTP访问,而且我不希望其中有任何Web或者CGI的成分。 d*j4?7qQ_
方案:
I D9w(aO2Z8[} 这个方案分为两个部分:第一个部分,是用于在空闲时间建立所有目录页面的CGI脚本集。我把它们放在/e/netsw/.www/,如下:
U/Z*l8X+g9}/~G5do!I:gY
0Js7] w8r M*` PB9l 代码:g.\"C8@ [%T$d h
-rw-r–r– 1 netsw users 1318 Aug 1 18:10 .wwwacl
3fk ?:u \+}~ drwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/
9Py,C{J*B%F/U0B`@ -rw-rw-rw- 1 netsw users 372982 Aug 5 16:35 LOGFILE`SK6S)N*]j
-rw-r–r– 1 netsw users 659 Aug 4 09:27 TODO
Z]9s/LYJ ^$Dg0D -rw-r–r– 1 netsw users 5697 Aug 1 18:01 netsw-about.html
yx/_3Do?H\7l -rwxr-xr-x 1 netsw users 579 Aug 2 10:33 netsw-access.pl
9nZd5G4A -rwxr-xr-x 1 netsw users 1532 Aug 1 17:35 netsw-changes.cgi"[m8v,nr3OL4yV+ff
-rwxr-xr-x 1 netsw users 2866 Aug 5 14:49 netsw-home.cgi
NYi?7b,^:o1yc drwxr-xr-x 2 netsw users 512 Jul 8 23:47 netsw-img/
\DQ!L])k%K -rwxr-xr-x 1 netsw users 24050 Aug 5 15:49 netsw-lsdir.cgi
P||KV -rwxr-xr-x 1 netsw users 1589 Aug 3 18:43 netsw-search.cgiyV*P)e&wkA${{%Pp2E
-rwxr-xr-x 1 netsw users 1885 Aug 1 17:41 netsw-tree.cgi
S3YI+s`S -rw-r–r– 1 netsw users 234 Jul 30 16:35 netsw-unlimit.lst;yAln B%XX3s
0Bn(r9jci-|eh'O\I
其中的DATA/子目录包含了上述目录结构,即实在的net.sw,由rdist在需要的时候自动更新。第二个部分的遗留问题是:如何连接这两个结构为一个平滑观感的URL树?我希望在运行适当的CGI脚本而使用各种URL的时候,使用户感觉不到DATA/目录的存在。方案如下:首先,我把下列配置放在服务器上DocumentRoot中的针对目录的配置文件里,以重写公布的URL /net.sw/ 为内部路径 /e/netsw:O;R5l2t1B!@ e

.wi}"Tez 代码:
klBY4ZZ RewriteRule ^net.sw$ net.sw/ [R]
#P\,j%?/tH9P5rY RewriteRule ^net.sw/(.*)$ e/netsw/$1at O p~

U }+yTK1S(}3L"z8g4m 第一条规则是针对遗漏后缀斜杠的请求的!第二条规则才是真正实现功能的。接着,就是放在针对目录的配置文件/e/netsw/.www/.wwwacl中的杀手级的配置了:J bm6tB
$A YT3qcGRi
代码:
+S9aw.G fJ'iw Options ExecCGI FollowSymLinks Includes MultiViews
%V+D(CdFU#BR Wq[ok#t
RewriteEngine on
8e+m;mlP {%M#u#K Mpv tcs%N.TZ
# we are reached via /net.sw/ prefix_9DF"i;h}O
RewriteBase /net.sw/t?RL1mF)B
$_!nQhN
# first we rewrite the root dir to'lP u-uS
# the handling cgi script/y!W+|,Rwx
RewriteRule ^$ netsw-home.cgi [L]
7S3wf)S;i RewriteRule ^index.html$ netsw-home.cgi [L]5o`1d.u~0nb,I

e p%SP rB8LV'l5rI # strip out the subdirs whenr-MF9E2Q
# the browser requests us from perdir pages
.r;U|(\&o c RewriteRule ^.+/(netsw-[^/]+/.+)$ $1 [L]&qI9MGQ6dAxtbUH

;m^ S"ah8w # and now break the rewriting for local files
ta[6fOf,Lx RewriteRule ^netsw-home.cgi.* - [L]
-@#YIr_W Z*_ RewriteRule ^netsw-changes.cgi.* - [L]
}9E~sl4gfQ p-L/~%@\ RewriteRule ^netsw-search.cgi.* - [L]
4`i9i K4`._a*pD RewriteRule ^netsw-tree.cgi$ - [L]
v]&HM/Mc4D? RewriteRule ^netsw-about.html$ - [L]
7?8[0y"Jib?+T"R RewriteRule ^netsw-img/.*$ - [L]
WX R'^ItI'g 'Zm+^1e9Yg
# anything else is a subdir which gets handled]$|v3\'zq{"k
# by another cgi script(Z~`({kY~!h4XL
RewriteRule !^netsw-lsdir.cgi.* - [C]
ECqH u^Sge(K%X RewriteRule (.*) netsw-lsdir.cgi/$12s3sM!Nzd&Pl.~"f:_r

%\Z j+C.I*W!~ 阅读提示:#_PU&DC

2at nG3P7`0F 注意前半部分中的标志L(最后),和无对应项(’-')
*{CJ.y2N;WS2e7v 注意后半部分中的符号!(非),和标志C (链)S(clodF)o)U-G_
注意最后一条规则的全匹配模式
_#S,u&|*X%@Y*A e 代码:
\#f*v2d!s8L5} NCSA imagemap和Apache mod_imapA]q\A5r"`5} S#sd P
说明:
3Iy|2k,l 许多人都希望在从NCSA网站服务器向较现代的Apache网站服务器转移中实现平滑过渡,即希望老的NCSA imagemap程序能在Apache的较现代的mod_imap支持下正常运作。但问题在于,到处都是通过/cgi-bin/imagemap/path/to/page.map引用imagemap程序的连接,而在Apache下,应该写成/path/to/page.map。
t7mI4\@(c4a)q`4U v.s;? B3Z:K
方案:
'c^DD2| W 使用全局规则在空闲时间去除所有这些请求的前缀:
G"MC#AB?0rw~
d-?6MH,eT*q8w 代码:
,S-Gq;],w+e RewriteEngine on7]HSVgJ yn"H
RewriteRule ^/cgi-bin/imagemap(.*) $1 [PT]
Vt'\UG4b
c bo@B.I 在多个目录中搜索页面
{fk:E gC7N 说明:p K9Bz+W!wA:ELp
有时会有必要使网站服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。
7rg5rm$x!Z-{p Y3E `
*gI[}K8o 方案:0[%Z^$[,g9khm4}dx
编制一个明确的规则集以搜索目录中的文件。
rS:o:f{.KqHy
U@]M`/D'Vi%l 代码:;OTD+t+g4s
RewriteEngine onRi8t&@5_
%N MK.KB^
# first try to find it in custom/…
Y\Ggk # …and if found stop and be happy:
b@WB1Gok$C RewriteCond /your/docroot/dir1/% -f
%^G!jk p Rw RewriteRule ^(.+) /your/docroot/dir1/$1 [L]&J7RW)M YS @'Ws
q+l%|Y$l`!]-~
# second try to find it in pub/…2H-i:r Sqs\'m
# …and if found stop and be happy:
7h7yMiN3[)I'yY1c RewriteCond /your/docroot/dir2/% -f
IU[En,w`c RewriteRule ^(.+) /your/docroot/dir2/$1 [L]ZQ] s$~-n}/~

tJ ce;]q:x O`7I/D # else go on for other Alias or ScriptAlias directives,
:m9~D@_xk ]j # etc.Ds1P%{DKO
RewriteRule ^(.+) - [PT]
G"i"|6kb &] wa7SMY+R
按照URL的片段设置环境变量Skpwa `
说明:
.B:PAA0L+~f`.z I 如果希望保持请求之间的状态信息,但又不希望使用CGI来包装所有页面,而只通过分离URL中的有用信息来编码。}n1xEv
2LY.[zh e@(I5_
方案:
[Q:~{y4UVD 可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI。如此,一个/foo/S=java/bar/的URL会被解析为/foo/bar/,而环境变量STATUS则被设置为”java”。
bAP*_QEk ho &{ {.f"[ ^c$Z
代码:
m r*B^$y(N*|[?+q t RewriteEngine on
0M~S~'i.u7} RewriteRule ^(.*)/S=([^/]+)/(.*) $1/$3 [E=STATUS:$2]
_(JP.l:i Rr 8H4Uy$?7J^6O8YN
虚拟用户主机
C%O}Eh8v UH_xw 说明:/~p+N,\*\4u Hz+jN
如果需要为用户username支持一个[url]www.username.host.domain.com[/url]的主页,但不是用在此机器上建虚拟主机的方法,而是用仅在此机器上增加一个DNS记录的方法实现。bruRuPM,u

.mn8A.RK4S 方案:
p)W:Z9z b#^I.D1A4e6m5| 对HTTP/1.0的请求,这是无法实现的;但是对HTTP/1.1的在HTTP头中包含有主机名的请求,可以用以下规则集来内部地重写[url]http://www.username.host.com/anypath[/url]为/home/username/anypath:
o8Y5GH bX` Vh!]
7[(]\ yt 代码:
N;no6e Z7V4]x RewriteEngine on
+`j2Wua RewriteCond % ^www.[^.]+.host.com$$C `6l*W2F
RewriteRule ^(.+) %$1 [C]3rV:e4\-m1iIB
RewriteRule ^www.([^.]+).host.com(.*) /home/$1$2
/n f-d7r Z H0@v;Rc x"K
为外来访问者重定向宿主目录m`0Ue~MM'\l4V&k#[L
说明:
!D-n%g!G T%M*bY 对不是来自本地域ourdomain.com的外来访问者的请求,重定向其宿主目录URL到另一个网站服务器[url]www.somewhere.com[/url],有时这种做法也会用在虚拟主机的上下文中。c~HXQ2F|s
B?;Yh4b
方案:7m,x$zb5\zf
只须一个重写条件:+p)sU?%a2S
A2r ^ A3^%Y
代码:
X9Tu+]3tU/e-fc RewriteEngine on@!oQw-S1L;a"O8VF V
RewriteCond % !^.+.ourdomain.com$
w~0X$NT i RewriteRule ^(/~.+) [url]http://www.somewhere.com/[/url]$1 [R,L]
-x$Fw)Da5\5Z Stn Y4s4{{H
重定向失败的URL到其他网站服务器\*YeXQFI
说明:m C(pd,f.}
如何重写URL以重定向对网站服务器A的失败请求到服务器B,是一个常见的问题。一般,可以用Perl写的CGI脚本通过ErrorDocument来解决,此外,还有mod_rewrite方案。但是须注意,这种方法的执行效率不如用ErrorDocument的CGI脚本!
Q-\4|HJ5Q Jae)tQ pq
方案:
CfL!P.S)EQ0m 第一种方案,有最好的性能而灵活性欠佳,出错概率小所以安全:
b)uV2}%YBv&In3i6K
%n[!c4X6{5u"` 代码: TG1v3n0Nn&B,s
RewriteEngine one }dx!g{2w$R5|.X_
RewriteCond /your/docroot/% !-f
nD1[8nop RewriteRule ^(.+) [url]http://webserverB.dom/[/url]$1
Q:t}N'dZX .icZDQ
但是其问题在于,它只对位于DocumentRoot中的页面有效。虽然可以增加更多的条件(比如同时还处理宿主目录,等等),但是还有一个更好的方法:P;{ [j1`3TF

?"q-gl"Luu 代码: Fr&sj7LjQ&L
RewriteEngine onE:elKE T$h8Z0z3O
RewriteCond % !-U
9Lo|3nK)_i RewriteRule ^(.+) [url]http://webserverB.dom/[/url]$1hae~m iF+JzQ

(u1_#s1hp)f)C7N 这种方法使用了mod_rewrite提供的“向前参照(look-ahead)”的功能,是一种对所有URL类型都有效而且安全的方法。但是,对网站服务器的性能会有影响,所以如果网站服务器有一个强大的CPU,那就用这个方法。而在慢速机器上,可以用第一种方法,或者用性能更好的ErrorDocument CGI脚本。
z}^m;{0NI j_ 5e[L d A/t
扩展的重定向
sA\ O`k*nc 说明:
;t*o J@4p6t AN 有时候,我们会需要更多的对重定向URL的(有关字符转义机制方面的)控制。通常,Apache内核中的URL转义函数uri_escape()同时还会对anchor转义,即,类似”url#anchor”的URL,因此,你不能用mod_rewrite对此类URL直接重定向。那么如何实现呢?
u!Rc+Jr[6K
/`ZK*ez l4_ 方案:
I.Ncg,lSW)u k%k 必须用NPH-CGI脚本使它自己重定向,因为对NPH(non-parseable headers [无须解析的HTTP头])不会发生转义操作。首先,在针对服务器的配置中(应该位于所有重写规则的最后),引入一种新的URL类型xredirect::$`P/TY/l&iU

vy"G{O!U"miL 代码:
%d siEL1k RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1
&{1W$a0[$n!Rk H~I [T=application/x-httpd-cgi,L]f#mUD-x'tA2w E

] Jy K9ml1{}(Fe 以强制所有带xredirect:前缀的URL被传送到如下的nph-xredirect.cgi程序:
[t0L{p9_"[1I AvP9~%?&P)[u
代码:5g:f?v }f6X
#!/path/to/perl
3p$Q(m x7pz7EI4Bd ##
M'E4[ A#K.[4h$v)s8CW ## nph-xredirect.cgi — NPH/CGI script for extended redirects(zLMx(_5\!Z~
## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.MZ5|C3k-sj5~0q
##
$E'M!l!He3?!][J H!?)]g#fD[
$| = 1;tH:m/gX` ]L
$url = $ENV;l*g#Q/tX_m2d
XU }M-CM
print “HTTP/1.0 302 Moved Temporarilyn”; yg$F w4j \B-^m-g'u
print “Server: $ENVn”;6{*nJ,? U
print “Location: $urln”; S#^rq1x#d
print “Content-type: text/htmln”;t^gy1n@[&A$F
print “n”;8?(SN/ZK H'iH"S
print “n”;
]3t l!] ~ print “n”;
G;jw)@;FQ.F print “n”;
xn#['v9e(x print “n”;$yf6|@PU9o.X5sP
print “n”;
(vn`"f2V9^2qr/t[o t print ”q1F3VJU H9OSO*Y
Moved Temporarily (EXTENDED)5w h)wi^6p!O9C.Jd
n”;
!x6l9e0AV)D"q.c print “The document has moved here.
F}2_'gXd g | K n”;sd(g+M \m S8|+v
print “n”;2h{~(I6Z0{Q4f[rH
print “n”;&\#J|4P)h6yHB"K9v
_-ym4UIC6F
##EOF##
]A5O V$kcJ k
8J'ZE$ra p| 这是一种可以重定向所有URL类型的方法,包括不被mod_rewrite直接支持的类型。所以,还可以这样重定向news:newsgroup:i p;U6] vX9`}4^V[2A
k.]fg[
代码:
&Z1e*\%sAP RewriteRule ^anyurl xredirect:news:newsgroup
L&E }bdw &PeVJ8a Z
注意:无须对上述规则加[R]或[R,L],因为xredirect:会在稍后被其特殊的传送规则扩展。6l s"P Zwv?
文档访问的多路复用'fZ;EZ7U4z/SH
说明:/imI'P!n'v8q
你知道[url]http://www.perl.com/CPAN[/url]的CPAN(Comprehensive Perl Archive Network)吗?它实现了一个重定向以提供,全世界的CPAN镜像中离访问者最近的一个FTP站点,也可以称之为FTP访问多路复用服务。CPAN是通过CGI脚本实现的,那么用mod_rewrite如何实现呢?
ny4jyGW )\`3c.I M
方案:
.L[D^ns'j'S*[(L"p 首先,我们注意到mod_rewrite从3.0.0版本开始,还可以重写”ftp:”类型。其次,对客户端顶级域名的路径最近的求取可以用RewriteMap实现。利用链式规则集,并用顶级域名作为查找多路复用地图的键,可以这样做:i$f4C tv;?Z a@&K|9t
z(zf*Gj(T$^P
代码:
9Y;e&t2N3B+s RewriteEngine on
x(m.R5Gu)n ~w7o'B RewriteMap multiplex txt:/path/to/map.cxan
]"W b @&M)`t RewriteRule ^/CxAN/(.*) %::$1 [C]gc,^k |%i
RewriteRule ^.+.([a-zA-Z]+)::(.*)$ $$2 [R,L]
wIZ+my1h!I
EfVK:VN;Y ##
~Ek^Q ## map.cxan — Multiplexing Map for CxAN!S!M.e0Ey+A7{I'A$e8u
##
z,e/g)PL/u 0Ek3]%M+hb&?
de [url]ftp://ftp.cxan.de/CxAN/[/url]
^ O+?7Yi0T&Y c:V uk [url]ftp://ftp.cxan.uk/CxAN/[/url]y8K(}k7i KJ
com [url]ftp://ftp.cxan.com/CxAN/[/url]3i5Ibv/pz2_e
:
`e1[ pBI%C6B(N ##EOF##
1S L7}.IS4L
}&L M ?)D 依赖于时间的重写.T+s4r3TA ?
说明:
[8h"vw'\[g/][+C c[2[ 在页面内容依时间不同而变化的场合,比如重定向特定页面,许多网管仍然采用CGI脚本的方法,如何用mod_rewrite来实现呢?
,D,FW"aksha0d
.H Q+b Gz5yI l 方案:
F/z,b%o?NH1M1k N)p8| 有许多类似TIME_xxx的变量可以用在重写条件中,利用STRING和=STRING的类型比较,并加以连接,就可以实现依赖于时间的重写:#g4} X*GrF
?M1{| m8P
代码:^FT qyyu
RewriteEngine on
1k F4H^"sF RewriteCond %% >0700
)H8riitiR RewriteCond %% <1900{*}? B9h7?G&GV
RewriteRule ^foo.html$ foo.day.html
PF6`6@/_ RewriteRule ^foo.html$ foo.night.html
WW3{G_*G4p :\/k6@Ns7| }wk1pb
此例使URL foo.html在07:00-19:00时指向foo.day.html,而在其余时间,则指向foo.night.html,对主页是一个不错的功能...
8e FXwT x1] R$e.I8I(J}B
对YYYY过渡为XXXX的向前兼容;FHk$E1Umu
说明:
;jP:fK? `J#f4u6g 在转变了大批.html文件为.phtml,使文档.YYYY过渡成为文档.XXXX后,如何保持URL的向前兼容(仍然虚拟地存在)?
9@` wb/UOqZ I1Z,E
wWw%[ T1r:W(T%B$P\ 方案:j6S{Y2c3ntG
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在,则用新的,否则,仍然用原来的。
^*z}$~6h3J$\h
`mSBm1e y 代码:Cx3e/j9J%R3q
# backward compatibility ruleset for
2Ed^]q} # rewriting document.html to document.phtmlN2t5e"C Im!d M
# when and only when document.phtml exists
9umPCJ6tk.drC # but no longer document.html
$N0d![)`kha3Mb RewriteEngine on~G|V oD3G
RewriteBase /~quux/
kvgB7y R^%Gc # parse out basename, but remember the fact
`G1{nXJQ2cZ RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]
q"Q,V&\Q$r;ZZ # rewrite to document.phtml if exists ie:?/Zg_7]
RewriteCond %.phtml -f
Qvki]8g R#Jt:?@(g.H RewriteRule ^(.*)$ $1.phtml [S=1]'o'M+X'u!u#I dn5Q `
# else reverse the previous basename cutout%s[d} ^py
RewriteCond % ^yes$O*fzJs;Qb
RewriteRule ^(.*)$ $1.html-PA*{V t%b:G-_.wg`W
4T q'ul%c }2t.fM*D`\
内容的处理,Ev7M] n8i L8}'Si
新旧URL(内部的)%@3AY Z!{3kJ I9[
说明:.TzJie0V%\9H])n
假定已经把文件bar.html改名为foo.html,需要对老的URL向前兼容,即让用户仍然可以使用老的URL,而感觉不到文件被改名了。#Seo,yXY8c0t#b
*L'c0R)`I|
方案:
_hA MK k uT!d 通过以下规则内部地重写老的URL为新的:
#X$H F!pows T0hA1~(S*t
代码:$D!z wMR%e$r*w
RewriteEngine onYp#]!oh
RewriteBase /~quux/
e7m1u8b|(U RewriteRule ^foo.html$ bar.html
(T [7tT7v0ledW 新旧URL(外部的)
P?,g6K4Ipms 说明:L+o}1O y9w
仍然假定已经把文件bar.html改名为foo.html,需要对老的URL向前兼容,但是要让用户得到文件被改名的暗示,即,其浏览器的地址栏中显示的是新的URL。
A@[+QBefq&m{ D,}:P,H:sTD
方案: Nn;{*tz e8g+d,]
作一个HTTP的强制重定向以改变浏览器和用户界面上的显示:
2Y4M0DZ;k^[Pxblw w:NF}4w.S
代码:
)DWy0J,X1_M/s&v RewriteEngine oneG-?kYH!l8\9U
RewriteBase /~quux/
L.D8P B6W RewriteRule ^foo.html$ bar.html [R]0X%x)O^yy e1w"f

Ns!O2`3S 依赖于浏览器的内容
ud!h&b kK 说明:`Qkf\ ^2CB
至少对重要的顶级页面,有时候有必要提供依赖于浏览器的最佳的内容,即对最新的Netscape提供最大化的版本,对Lynx提供最小化的版本,而对其他的浏览器则提供一个功能一般的版本。3rD8l*A5e|

0?(D(O\1aY#g 方案:
r6fli6T IiN 对此,内容协商无能为力,因为浏览器不提供其那种形式的类型,所以只能在HTTP头"User-Agent"上想办法。以下规则集可以完成这个操作:如果HTTP头"User-Agent"以"Mozilla/3"开头,则页面foo.html被重写为foo.NS.html,而后重写操作终止;如果是"Lynx"或者版本号为1和2的"Mozilla",则重写为foo.20.html;而其他所有的浏览器收到的页面则是foo.32.html:2i'M(@zU~"AZBJ

Y Ko,T5m(L,J 代码:
H)AWL%u%G/so RewriteCond % ^Mozilla/3.*@Z@3a/OyA
RewriteRule ^foo.html$ foo.NS.html [L]7?7D2K cY
6H5QYt jA:fu3\
RewriteCond % ^Lynx/.* [OR]4p w;mrugr!_-X4G q
RewriteCond % ^Mozilla/[12].*
G| r*G@ M Xc RewriteRule ^foo.html$ foo.20.html [L]
&z@-P^(K(M0j B YY0S u#I!_4h!M
RewriteRule ^foo.html$ foo.32.html [L]"K D.O^o\2p
"z o_4k(Y-V
动态镜像
E:i.rP#L9P 说明:6Mru,PZ gN
假定,需要在我们的名称空间里加入其他远程主机的页面。对FTP服务器,可以用mirror程序以在本地机器上维持一个对远程数据的最新的拷贝;对网站服务器,可以用类似的用于HTTP的webcopy程序。但这两种技术都有一个主要的缺点:此本地拷贝必须通过这个程序的执行来更新。所以,比较好的方法是,不采用静态镜像,而采用动态镜像,即,在有数据请求时自动更新(远程主机上更新的数据)。
*c~KRS-vv
4Na%L$s6r ygC 方案:
!X8X'O:s)P-{P 为此,使用Proxy Throughput功能(flagc*zh+FG(U6o3s"r;CO
),以映射远程页面甚至整个远程网络区域到我们的名称空间:!^2r AAF^7J0]

i:J'g2sT/[!EU 代码::w^$FO1jX
RewriteEngine on}!Os2H*N(Q L/O&|
RewriteBase /~quux/3S0w4@'e_#M B!xg/M
RewriteRule ^hotsheet/(.*)$ [url]http://www.tstimpreso.com/hotsheet/[/url]$15k V ^8])Lm`X
wB:\7g)CtlF
RewriteEngine ony lN3G8c1b i0{3~
RewriteBase /~quux/jjvv:U
RewriteRule ^usa-news.html$ [url]http://www.quux-corp.com/news/index.html[/url]
fub"W^ j
6L| lA8M.?5i 反向动态镜像
(EjZCYi]U#lh 说明:jv7cg-l5n"a
... N!M0J6Hq
方案:8P3uD%~[&Xp
代码:
&m5d-pw-@1lU1b!yMc'Q RewriteEngine on
&u q&`h d:ED RewriteCond /mirror/of/remotesite/$1 -U"sd0Vi)y"EH
RewriteRule ^[url]http://www.remotesite.com/[/url](.*)$ /mirror/of/remotesite/$1
4\)r9~,[Q'i%yo MC7k6c%AS B^u
通过Intranet取得丢失的数据
-y-wO8w+K%cAa T 说明:2nK/_ja&m
这是一种在受防火墙保护的(内部的)Intranet(www2.quux-corp.dom)上保存和维护实际数据,而虚拟地运行企业级(外部的)Internet网站服务器([url]www.quux-corp.dom[/url])的巧妙的方法。这种方法是外部服务器在空闲时间从内部服务器取得被请求的数据。 B DVwg:j
)K1B9s'AV~9X Sr+v`G
方案:-^8@L/{4y
首先,必须确保防火墙对内部服务器的保护,并只允许此外部服务器取得数据。对包过滤(packet-filtering)防火墙,可以如下制定防火墙规则:
WUda9u J;VXD&iy|
代码:[;`A?q9K'pX,K9s
ALLOW Host [url]www.quux-corp.dom[/url] Port >1024 –> Host www2.quux-corp.dom Port 80DS?%_FG
DENY Host * Port * –> Host www2.quux-corp.dom Port 807[:Al'Cu*x)ye L

)T,\*k+M6mb'e!n~ 按你的实际配置,只要对上例稍作调整即可。接着,建立通过代理后台获取丢失数据的mod_rewrite规则:Ki*`-r~-|J&gv-q
2u"v1P5thqz
代码:
[Zh7w$W[ RewriteRule ^/~([^/]+)/?(.*) /home/$1/.www/$2O8[8e C({U
RewriteCond % !-fc!^p*{ Oa$xs7Y'wb w8j
RewriteCond % !-d ds7B'~5@o q
RewriteRule ^/home/([^/]+)/.www/?(.*) [url]http://www2.quux-corp.dom/~[/url]$1/pub/$2
'C!@W]0W4mn8L d#T
3g ALI$s1t'O_6m~ 负载的均衡5W.ToR:| o!nM
说明:
Ss2W3X&f)e.Q'u 如何均衡[url]www.foo.com[/url]的负载到www[0-5].foo.com(一共是6个服务器)?DxU#W P#Z o }
7exH pa8p
方案:
L"E(H d D O Vn 这个问题有许多可能的解决方案,在此,我们讨论通称为“基于DNS(DNS-based)的”方案,和特殊的使用mod_rewrite的方案:
wDS,Yl-s(l1{d,RL o(C
&?SB"vO @0W l8F DNS循环(DNS Round-Robin)1mtEF;E?OM4xd
最简单的方法是用BIND的DNS循环特性,只要按惯例设置www[0-9].foo.com的DNS的A(地址)记录,如:
$l2l w.m&e4n g ^&Bs"e\9GK/A
代码:2Q]/f8ZSIu.~g,Ch
www0 IN A 1.2.3.1
2}Q9W&O3fz)U(j www1 IN A 1.2.3.2
%}_ kEt3\ www2 IN A 1.2.3.3
vy5i^e xc www3 IN A 1.2.3.4
#Cu4oeuoi!C www4 IN A 1.2.3.5E&m0?r9t4C\
www5 IN A 1.2.3.6
)gk:N7q c0@-jm2B
"T gRA&h5Y9u"pg V.c 然后,增加以下各项:
W3O%XS$fT'C%@
egCvCx;dF 代码:c)Ok ?Z
www IN CNAME www0.foo.com.
JD-P7DZ*bc,K IN CNAME www1.foo.com.
&Wj Hr4|Ix Q7Y#X IN CNAME www2.foo.com.
}T$e n#R? IN CNAME www3.foo.com.%P&WfbTT$De?
IN CNAME www4.foo.com.
m9?wW ` IN CNAME www5.foo.com.GV+}!k*m@V5f7w
IN CNAME www6.foo.com.j!Bnv `CmF

,Zvg)k V,l(ub&}Q 注意,上述看起来似乎是错误的,但事实上,它的确是BIND中的一个预期的特性,而且也可以这样用。无论如何,现在[url]www.foo.com[/url]已经被解析,BIND可以给出www0-www6 - 虽然每次在次序上会有轻微的置换/循环,客户端的请求可以被分散到各个服务器。可是,这并不是一个优秀的负载均衡方案,因为,DNS解析信息可以被网络中其他名称服务器缓冲,而一旦[url]www.foo.com被解析为wwwN.foo.com[/url],则其后继请求都将被送往[url]www.foo.com[/url]。但是最终结果是正确的,因为请求的总量的确被分散到各个服务器了
\$LC^ W,E'c/hVuK P!W~T&|K
DNS 负载均衡
z,bN \!v"pIZ 一种成熟的基于DNS的负载均衡方法是使用[url]http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html[/url]的lbnamed程序,它是一个Perl 5程序,带有若干辅助工具,实现了真正的基于DNS的负载均衡。
9g)Qte8~5T m 3{!R?*gG|
代理吞吐循环(Proxy Throughput Round-Robin)
l:g3fC+IG 这是一个使用mod_rewrite及其代理吞吐特性的方法。首先,在DNS记录中,将www0.foo.com固定为[url]www.foo.com[/url],如下:
i4as4o9p _)je)|'X
代码:
)Gwm$M"H|7\ www IN CNAME www0.foo.com.y oM6P'I

Rc.F P#{GQ&CM g 其次,将www0.foo.com转换为一个专职代理服务器,即,由这个机器把所有到来的URL通过内部代理分散到另外5个服务器(www1-www5)。为此,必须建立一个规则集,对所有URL调用一个负载均衡脚本lb.pl。
4p7Sq k,o
9JA9ZWv4i]d D 代码:
qvTF)D)b jX7nR+V RewriteEngine onnnjlQY~
RewriteMap lb prg:/path/to/lb.pl
7SSonv\rV h RewriteRule ^/(.+)$ $ [P,L]$jEq PJ9a0G2|A
e4}3}r;k)us,UGr
以下是lb.pl:
1OE"L\Gk X9J%cx ]R+d`
代码: PP:f E\.l r
#!/path/to/perl
3_,yyUAgk^$aM ##
Vb;ds\ ## lb.pl — load balancing script
C~u6]j0_&? u9t,m ##
\ R+ZFe-I
%`0JFj*i $| = 1;
O?b"O:xn E ^$c6L'cV
$name = “www”; # the hostname base
f5~)Ihk9z9n $first = 1; # the first server (not 0 here, because 0 is myself)Z8V:j0yDwtHd
$last = 5; # the last server in the round-robin
${g Ow QHNH $domain = “foo.dom”; # the domainname
uVz5IgU /FM?N)W-e7@
$cnt = 0;2u;f(gZaB8In
while () {
(i.|a"v2b? Z3m#`5P&_:W2M $cnt = (($cnt+1) % ($last+1-$first)); ] h B3dma
$server = sprintf(”%s%d.%s”, $name, $cnt+$first, $domain);/x4P dC%w\8~h
print “http://$server/$_”;
qa/s4tSE.b#l:K }9Bh8YE$q~
(~%@1}4@9Ws3a)l
##EOF##
&Y5cF:e&I 8S&J%Ch/L&Q nU%A
最后的说明:这样有用吗?www0.foo.com似乎也会超载呀?答案是:没错,它的确会超载,但是它超载的仅仅是简单的代理吞吐请求!所有诸如SSI、CGI、ePerl等等的处理完全是由其他机器完成的,这个才是要点。B~4g+L9~v)g4Xz
硬件/TCP循环&B5ltH5C
还有一个硬件解决方案。Cisco有一个叫LocalDirector的东西,实现了TCP/IP层的负载均衡,事实上,它是一个位于网站集群前端的电路级网关。如果你有足够资金而且的确需要高性能的解决方案,那么可以用这个。
2P0a@E:j yA'Q
a&P+_pKJ8M4x 反向代理
[~`1~:u0g 说明:@ } z8S\

*tB&?9?Ob9~u 方案:q1A^c"| K
代码:
E|0M#|g2Vk ##
,Q\Q"G7}PTd ## apache-rproxy.conf — Apache configuration for Reverse Proxy Usage
F{Fn E*\%o Z&X ##"x UL#B5b!jf ZR$\ \!\

,eaH9f4MU.p:UKF # server type
TD C$Q5Wc1c,~p ServerType standalone
R*qI;k$k:a Listen 8000 n T8f!P"HYf3B9U
MinSpareServers 16&C/fj{9}\
StartServers 16
;~*Z6f,eFS!K MaxSpareServers 16 k"b$rj2T\%j&I
MaxClients 16
I&r*o$K` MaxRequestsPerChild 1000ZC p.Z4x
`L,o0Rsw{
# server operation parameters
(d:a!x3H r-] KeepAlive on
jF"}#@ ~KQ$L MaxKeepAliveRequests 1004p{bf/F!h(\1s6y
KeepAliveTimeout 15
9[\0z'M U.E*P[2y&z Timeout 400
.aL6em4}cNM L7a IdentityCheck offx1E5R2^!HU9SM+W c
HostnameLookups off
CZ9ix7C9yJ8H
*m*V/Q;Ft7wiC6m ~Q # paths to runtime files
@8yeeV PidFile /path/to/apache-rproxy.pid!I7U2P4w4OM
LockFile /path/to/apache-rproxy.lock
;` d3r&I)ge+s ErrorLog /path/to/apache-rproxy.elog
x9`N S8D"Y CustomLog /path/to/apache-rproxy.dlog “%t %h -> %e URL: %U”
(J)knoqs
$b/FC-{ia # unused paths
\F,_6Ku7h5o8t ServerRoot /tmp s ?S1jY
DocumentRoot /tmp%}U'_0WO-o
CacheRoot /tmp
y#t\,k3CM y9j RewriteLog /dev/nullFg)]$Xp`D-J
TransferLog /dev/null#f5k \*A]E
TypesConfig /dev/nullr,B1QNffo'P
AccessConfig /dev/null
O0y$i$q4tZu ResourceConfig /dev/null
p3p,~:V5{Vr _;@S9Di]r7t
# speed up and secure processingYlE-I a~ Im B@

A:[{)l9O3yh xp2@ ^u Options -FollowSymLinks -SymLinksIfOwnerMatch
|1jy O3p?3Q AllowOverride None
(iv`3k!a~+}j1Z wZ y,Lt)PC]j0M
# the status page for monitoring the reverse proxy:n^ }5_&xo l2?^
$P)i2Q,}Z_ca
SetHandler server-status
&HhJ ^9g
8MKsix ` # enable the URL rewriting engine V8B4i6iGUKT
RewriteEngine on
+i Dw~v z N RewriteLogLevel 0
-B'p,VV}8F(~ 9_:`+j/Cda
# define a rewriting map with value-lists where
4C`^!J VL p # mod_rewrite randomly chooses a particular value]bn"vLA
RewriteMap server rnd:/path/to/apache-rproxy.conf-servers+N N:`"xd4v

R#q"Z5[? # make sure the status page is handled locally0~#]7Av5^)mZ!lv
# and make sure no one uses our proxy except ourself4z#r&S\)\F/A)P!K
RewriteRule ^/apache-rproxy-status.* - [L]cT^(oAVc i
RewriteRule ^(http|ftp)://.* - [F]
H+B:HE7E 7[ n'o6Q6{.c'N
# now choose the possible servers for particular URL types
*GfN:^W RewriteRule ^/(.*.(cgi|shtml))$ to://$/$1 [S=1]?!UGb5W6|
RewriteRule ^/(.*)$ to://$/$1
2au)}9\P*S `l5m1O#h
# and delegate the generated URL by passing itIt"|j?x7M
# through the proxy module
(^v8uJ;P RewriteRule ^to://([^/]+)/(.*) http://$1/$2 [E=SERVER:$1,P,L]$b ]8{,~/?t-K
Uk;f Sy4s*d,}
# and make really sure all other stuff is forbidden
9D t3tI_Vjp # when it should survive the above rules…
,Gyob$~6|/t5t RewriteRule .* - [F]
Q p O)\Y)V/V [-aT3j8c_
# enable the Proxy module without caching9w;u N'Yo
ProxyRequests on
EDFr.H NoCache *
D)uTBqs+[@%K
$zW1vA,x*G!d rA # setup URL reverse mapping for redirect reponsesa|sO/{ ??
ProxyPassReverse / [url]http://www1.foo.dom/[/url]
0[ v qMS5_8@p7V ProxyPassReverse / [url]http://www2.foo.dom/[/url]*V6]q$NZW"niQ:^C
ProxyPassReverse / [url]http://www3.foo.dom/[/url]
_'Xw*B(gL ProxyPassReverse / [url]http://www4.foo.dom/[/url]0fk Bm A8k
ProxyPassReverse / [url]http://www5.foo.dom/[/url]
4@7ZSjD HEoZ+N'[ ProxyPassReverse / [url]http://www6.foo.dom/[/url]?l6?]o3f0Q I D
^O @ GP4lk
##X0f@(l;q
## apache-rproxy.conf-servers — Apache/mod_rewrite selection table,w9R lGm il
##GX%E-_&v+Q
a1kN#D+M0q
# list of backend servers which serve staticy6e4kb8n!v!u*w
# pages (HTML files and Images, etc.)
@y,B/j X4k:c#l static www1.foo.dom|www2.foo.dom|www3.foo.dom|www4.foo.domQ#|M1~;Y2C#i

R&IU n _9@gU_)m # list of backend servers which serve dynamically
(r wk+`3D9h'pnxG # generated page (CGI programs or mod_perl scripts)mS(A [ f
dynamic www5.foo.dom|www6.foo.dom-ggN4S|6`5u.|
"w`9Q7_/W4A~,m
新的MIME类型,新的服务B:TUd"Q2h#u Nd
说明:
E6F6hsYw 网上有许多很技巧的CGI程序,但是用法晦涩,许多网管弃之不用。即使是Apache的MEME类型的动作处理器,也仅仅在CGI程序不需要在其输入中包含特殊URL(PATH_INFO和QUERY_STRINGS)时才很好用。首先,配置一种新的后缀为.scgi(for secure CGI)文件类型,其处理器是很常见的cgiwrap程序。问题是:如果使用同类URL规划(见上述),而用户宿主目录中的一个文件的URL是/u/user/foo/bar.scgi,可是cgiwrap要求的URL的格式是/~user/foo/bar.scgi/,以下规则解决了这个问题:
idNG w1i
0AU k pad B[d 代码:'M0VYIf/[$\
RewriteRule ^/[uge]/([^/]+)/.www/(.+).scgi(.*) …WC~3GQ5^~%T,fW
… /internal/cgi/user/cgiwrap/~$1/$2.scgi$3 [NS,T=application/x-http-cgi];|;nE ?o;xg&Z(H
FIh0JCL
另外,假设需要使用其他程序:wwwlog(显示access.log中的一个URL子树)和wwwidx(对一个URL子树运行Glimpse),则必须对这些程序提供URL区域作为其操作对象。比如,对/u/user/foo/执行swwidx程序的超链是这样的:_$X!M2`A8O
%RR:JH$wzHj+`
代码:)C dZ9]|)tX
/internal/cgi/user/swwidx?i=/u/user/foo/
?h3F2g!uK ?2hr[L .@TlH/Za,zD4[U
其缺点是,必须同时硬编码超链中的区域和CGI的路径,如果重组了这个区域,就需要花费大量时间来修改各个超链。
cc ^Qc%L9k#r%u 'uppp5A
方案:RM/H7[N4K2vB
方案是用一个特殊的新的URL格式,自动拼装CGI参数:
5U$sG V,vfy AK d\"?%L6q nU
代码:
.D Q5EW/vp:ny? RewriteRule ^/([uge])/([^/]+)(/?.*)/* /internal/cgi/user/wwwidx?i=/$1/$2$3/&L.T2D YTv;Q-H
RewriteRule ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3h M%Sj#}6@M
%?vf{8sbA+zNO
现在,这个搜索到/u/user/foo/的超链简化成了:
+t3v \4G'~
l+s:bQ|H(w-[ 代码:
n5|1W ez^5RT:ss2C HREF=”*” O V O:^f7Q2Rn&w&C0h$c2e

\*g2y$n`@ q6q4x%~m 它会被内部地自动转换为
#YI7e,W?Ne #z1l3} s:rg/n
代码:
AR.e:YP2~z$W!l,q /internal/cgi/user/wwwidx?i=/u/user/foo/ FR`(V%S `t h
0snh @k1K8k0Q
如此,可以为使用:log的超链,拼装出调用CGI程序的参数。XT:iL,[(J)cr f9D ]9v
kSCJq?eu6a
从静态到动态
4\Resm jAF#~ 说明:G&Pj*q"ET7`8U
如何无缝转换静态页面foo.html为动态的foo.cgi,而不为浏览器/用户所察觉。
/~{8OD(|Z/C3c!smw
^8VY#t G MR Kn 方案:-R6j*O:V+pU.D
只须重写此URL为CGI-script,以强制为可以作为CGI-script运行的正确的MIME类型。如此,对/~quux/foo.html的请求其实会执行/~quux/foo.cgi。
7_2mM*?U(^S4R;Q#e{ 3Z;F zdB%u8xmI#M
代码:
0H6[xp T;{/K7Xw7~ RewriteEngine onU2w3Fv&R+|4Z1c8\
RewriteBase /~quux/^0H2HG?.Jv[:W XI-E
RewriteRule ^foo.html$ foo.cgi [T=application/x-httpd-cgi];@1vb^']k\,nV5^%m
9n2Nz5|GQ
空闲时间内的内容协商
!B-TEx}+d$\ f 说明:&~u#fiU)C#r/m
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供CGI生成的页面,除非有人(或者是一个cronjob)删除了这些静态页面,而且其内容可以得到更新。
}8oz*~z7} !eG%iY0j3W
方案:HjEh%Mo9{(_
以下规则集实现这个功能:
&X+r'z%Z9mI6bhY 代码:
4~TU y/T5m"J6s7Mb,s RewriteCond % !-s
q L V g [ d i RewriteRule ^page.html$ page.cgi [T=application/x-httpd-cgi,L]$dG:tt'Ew5Xw
这样,如果page.html不存在或者文件大小为null,则对page.html的请求会导致page.cgi的运行。其中奥妙在于,page.cgi是一个将输出写入page.html的(同时也写入STDOUT)的常规的CGI脚本,执行完毕,服务器则将page.html的内容发出。如果网管需要强制更新其内容,只须删除page.html即可(通常由一个cronjob完成)。3~&p)_A&hO5x$oQi

%H U@[+YP!} 自动更新的文档6}0`7nRvJ-?g
说明:UUr VX |
建立一个复杂的页面,能够在用编辑器写了一个更新的版本时自动在浏览器上得到刷新,这不是很好吗?这可能吗?
]L?g5e$b7l)C)cpE
)GQZ7w O}#\'[&oH 方案:
V4Y"a`)kQxD 这是可行的! 这需要综合利用MIME多成分、网站服务器的NPH和mod_rewrite的URL操控特性。首先,建立一个新的URL特性:对在文件系统中更新时需要刷新的所有URL加上:refresh。.Od@w"q.Vb `b

bls+wo%[W3K Gz 代码:
.VQ8d,td:z.\(N-d RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1
n)TK |/L:o&D ]/f d_ al}
然后,修改URL$V uU0EzL
?EUs.c.H
代码:
#~H"iM;nR /u/foo/bar/page.html:refreshI(V#\8u qAE+V%p0V

+ilV4i(j3{ mNB4Z%b 以内部地操控此URL
k \(`rz}0X'S
U]3TZA#m 代码:
(A&n"Hee /internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
w"R| a4Aj^
A ^3H \Z 接着就是NPH-CGI脚本部分了。虽然,人们常说”left as an exercise to the reader”,我还是给出答案了。
]e5mT*gqmt(I"] {/U
hcJ9V Pq 代码:G/|W9d v:IR
#!/sw/bin/perl
q"Z7r"M-hB ##
vGL`#FC+|Au ## nph-refresh — NPH/CGI script for auto refreshing pages W4W(E(E(Z"G
## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
PSR.}k:O(]#v/b ##t*~u If0Z
$| = 1;
0H ],B$XB
_)E(U/a5r:hK"T%Q c # split the QUERY_STRING variable
f0u\-G/oC5~F:G @pairs = split(/&/, $ENV);
CfL%a(bq foreach $pair (@pairs) {
r5siC)p ^.F%Ur ($name, $value) = split(/=/, $pair);
qH6OlH!d!@}1krg $name =~ tr/A-Z/a-z/;
kB,O*D W_+n $name = ‘QS_’ . $name;
~1JmE'p $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;
e[!H4w5kR eval “$$name = “$value”";
q!z:S.X!`hc| z.T!\%e };K1G@0n.o'T-zK"P3}@r
$QS_s = 1 if ($QS_s eq ”);
8Zgqwz @1j \-B2@ $QS_n = 3600 if ($QS_n eq ”);
~BL%ys(Q if ($QS_f eq ”) { XJ6x.vh$Ph
print “HTTP/1.0 200 OKn”;
d p(Dum|j(e print “Content-type: text/htmlnn”;
S3GfS'k1H*{ K print “&b&ERROR&/b&: No file givenn”;
i2w [p%ZK%GW exit(0);c0j*eA,{([
}Rzv#X@}%P(p7FpX
if (! -f $QS_f) {
1NJ)T4@ U h,ij print “HTTP/1.0 200 OKn”;2KP E5l)}U
print “Content-type: text/htmlnn”;
#Gr%P k W7G|'S&A~9X print “&b&ERROR&/b&: File $QS_f not foundn”;
N^U:[OI'|%{C exit(0);lNI5[PC G
})M D+L7K0q
g@0~[f`
sub print_http_headers_multipart_begin {(qH(g9LW%b Z1F/b
print “HTTP/1.0 200 OKn”;
Ee#ci` $bound = “ThisRandomString12345″;e|gE5c2Q5I$nD@x
print “Content-type: multipart/x-mixed-replace;boundary=$boundn”;
tfyR"wd &print_http_headers_multipart_next;
[D |3n@&k }
F$M~M2}TC9E {|m*EBD{!_
sub print_http_headers_multipart_next { etRqe|N
print “n–$boundn”;#D] V)q0L
}g6B+UZnvzc
[3S[6U0\W
sub print_http_headers_multipart_end {
a#E@#Y+W0RV} print “n–$bound–n”;
(d!bp'G9|O1p0B }
_r1pRc*v~4Y
&V _J7a.rsr)Z{:^[ sub displayhtml {KC1p t)S"i:l*n%s
local($buffer) = @_;[P5YZg
$len = length($buffer);
$G+G)nKT#X7pS print “Content-type: text/htmln”;cT~ p:x4oS%?!Z
print “Content-length: $lennn”;
(S0D d Bg.}OI7L print $buffer;&vH\n1f}2}9D
}
*m(Wr{gy1P%Z j6jP
1C]n ~}+mT sub readfile {(P2_8f1@$@9Sv{ }'Z/e
local($file) = @_;
W"GkH}L A g local(*FP, $size, $buffer, $bytes);
6d'a*hq-Ze#j ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
|;qQ\$kbOe $size = sprintf(”%d”, $size);
H/j5M+y"ga5t open(FP, “&$file”);8\r2y'{0h6g
$bytes = sysread(FP, $buffer, $size);-g+]0i2EL,C
close(FP);
5P[6J Zu"G(~#S+Yc return $buffer;%cw x8xa
})I#w5KVG7J;K~

5f(G4gM'rNb $buffer = &readfile($QS_f);6V"s/sN?Lw(O
&print_http_headers_multipart_begin;
] Brt9~$OAR:f &displayhtml($buffer);
b)RS^5s u5u0|/]M3TW ? -a X6|Vh|
sub mystat {
)aj(}N7l X$q local($file) = $_[0];B9@%Y"R5D{
local($time);
V(\#V9Q%Fg
3|pi]Mp ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
H&Yn3W:U_5hd return $mtime;
,\ RK$Q*Y'ZK }S+`.Bcq;D

n3@!ZJ.biI $mtimeL = &mystat($QS_f);
KR9@6s&s $mtime = $mtime;/ZO{l9i}`.V;p&d$Y
for ($n = 0; $n & $QS_n; $n++) {(e'fM:k2r8Q N
while (1) {
5Q`)k%q] L F"v $mtime = &mystat($QS_f);
i7G3g3Q[Z|\'l if ($mtime ne $mtimeL) {
;i*KBw$|+Nu $mtimeL = $mtime;1@{ {5[ z:^!]:p#_
sleep(2);
lo-e8sbtb.Ws5J $buffer = &readfile($QS_f);_1OG~L O(o-m
&print_http_headers_multipart_next;y^dGi2O'S3y
&displayhtml($buffer);
2smQif6ljb sleep(5);'Z'mf?h
$mtimeL = &mystat($QS_f);1DqT?\0@f s%~
last;
$@/U,f!wg M&N:eW2mM }
Cf0E ^C8G!iK sleep($QS_s); `*D OFTs^'v4E:{-k
}
2LGN'Vp0h1o }\ OP A1\A6fGx
5e"O)R(}0^+s,U#l:C
&print_http_headers_multipart_end; {MA9o0q p_h6Q|
'b okqk*f~
exit(0);
A!zC FA iZH~
]Z#L)`*n:[m \ ` f ##EOF## CGQ4t5F
大型虚拟主机s6T+~6u(U#aK4iX
说明:
F y/t}+~|yK Apache的功能很强,在有几十个虚拟主机的情况下运行得很好,但是如果你是ISP,需要提供几百个虚拟主机,那么这就不是一个最佳的选择了。 vz?5N,R%ymL5\

1VYX,]#j7{W ]0q 方案:/N7Q V_.a/`(O
为此,需要用代理吞吐(Proxy Throughput)功能(flag
L8a#?*GE*e$bN
jbs D(N9~:p )映射远程页面甚至整个远程网络区域到自己的名称空间:
AM6ZnSZ)_7S#M
*Ew$dgr-|d!r t 代码:*~W#@,p,?/bC
##
X%^ J'gD ## vhost.map
b1Nlx @7O$_n8Z ##E C@c,y.G"] j
[url]www.vhost1.dom:80[/url] /path/to/docroot/vhost1a.E+bA0R
[url]www.vhost2.dom:80[/url] /path/to/docroot/vhost2
td Cg;|,k :
G;ls:DE ES\$Mt2l [url]www.vhostN.dom:80[/url] /path/to/docroot/vhostN
R3[Yd'n2} T"\"j"Z9i'F O
代码:by'x{%NL Y
##
%t gZ3u$zZu ## httpd.conf ` zC-]y
##3c9JzyG1s u
:Wc]%FO6s
# use the canonical hostname on redirects, etc.
b&S~6QIs r6U UseCanonicalName on
B.cPK6]|+x `.M9Y1v
2hcIQ1cJT :
LMtlnX9|.C~ # add the virtual host in front of the CLF-format#L"Y"V!I'S&o
CustomLog /path/to/access_log “%e %h %l %u %t “%r” %>s %b”
F0Pj.p+Fv8[B9P :
6G?Zj!A+|[?
.H"^Q0w4l+Vy2~%CP9x O # enable the rewriting engine in the main serverwZ;k8Hh ~O\l
RewriteEngine onq2L u9f$r8L [

R5S(t"A l \dB;i # define two maps: one for fixing the URL and one which defines|b'w%Df1}6Q*T
# the available virtual hosts with their corresponding
h7j0\ {7]~JT*?` # DocumentRoot.`-\:aA,K-_'?
RewriteMap lowercase int:tolower h:u*S_0aZU
RewriteMap vhost txt:/path/to/vhost.map*m-L4TGDh4S
3O2Bv ZEiTA6eCe
# Now do the actual virtual host mapping
*Q3XN c7P1e:a0u/p # via a huge and complicated single rule:K^k-A,CXqT
#
4_7tvx ~:s9X!Wd # 1. make sure we don’t map for common locations
B(P;]!?|#^,QX)L RewriteCond % !^/commonurl1/.*
tF-n5y2{NIO ["w-~ RewriteCond % !^/commonurl2/.*bHoz-|{5U!D-|7h
:
!SP"Zi+B!anH RewriteCond % !^/commonurlN/.*a Ex-N G^
#.FchNi%gu
# 2. make sure we have a Host header, because9g_ P:A2obj8h%s
# currently our approach only supports9AON\le
# virtual hosting through this header
B4DuvU9[0\ RewriteCond % !^$$RI6V4gh([5a {
#
Q-V4dh/Sb|U # 3. lowercase the hostname
G5B#? ] xC"P RewriteCond $|NONE} ^(.+)$T)J4MbO
#0v-YS"y M
# 4. lookup this hostname in vhost.map and
ZW+RuE#QiO O # remember it only when it is a path'au3\?3s8k6XN D
# (and not “NONE” from above)w*a Bu+}jN-[
RewriteCond $ ^(/.*)$
Qy@U-x1e]`1c #
`t|*T"Y&`,D5U # 5. finally we can map the URL to its docroot location0i(r*E.{\S"j.}QU
# and remember the virtual host for logging puposes]9T:dRw*K'M,P
RewriteRule ^/(.*)$ %1/$1 [E=VHOST:$}]$^6zu-] \G k.vG${
:
S;Fp^c_%P
T:JO(W'j xC 对访问的限制
-[;FoZ)ZFm| Y 阻止Robots(~$Jj:Z'c,`f:y
说明:
+~ MdPw-@r 如何阻止一个完全匿名的robot取得特定网络区域的页面?一个/robots.txt文件可以包含若干”Robot Exclusion Protocol(robot排除协议)”的行,但不足以阻止此类robot。9lMfeU/@

$F]8FsT^ 方案:
F ac.[*j 可以用一个规则集以拒绝对网络区域/~quux/foo/arc/(对一个很深的目录区域进行列表可能会使服务器产生很大的负载)的访问。还必须确保仅阻止特定的robot,就是说,仅仅阻止robot访问主机是不够的,这样会同时也阻止了用户访问该主机。为此,就需要对HTTP头的User-Agent信息作匹配。8pSc3cT-k5G

Y ug P8}AP 代码:
z-y:Z7K]zi RewriteCond % ^NameOfBadRobot.*4t/PAq0t MfxF Y
RewriteCond % ^123.45.67.[8-9]${w"o,vx9h d
RewriteRule ^/~quux/foo/arc/.+ - [F]
4e X5l5[9O"e#_~lt 阻止内嵌的图片
#{-NO5vE1X:Xp\+]xET 说明:
Wu1}g;})X,Hkv} 假设,[url]http://www.quux-corp.de/~quux/[/url]有一些内嵌图片的页面,这些图片很好,所以就有人用超链连到他们自己的页面中了。由于这样徒然增加了我们的服务器的流量,因此,我们不愿意这种事情发生。
#F }M@C\%P-m#{
1ih d X)Z m!Y+[)[ 方案:
%Q&IS%Z Z_uJ S 虽然,我们不能100%地保护这些图片不被写入别人的页面,但至少可以对发出HTTP Referer头的浏览器加以限制。
1T k4iNzO
$U4k6?/d7^ 代码:
kzu&I6ku3@:J RewriteCond % !^$,ZY1ucp
RewriteCond % !^[url]http://www.quux-corp.de/~quux/.[/url]*$ [NC]2^%_g'c!R9d"gT#n
RewriteRule .*.gif$ - [F]
8TagH(Xj!G8\!| $coy-L&{2~$wS
RewriteCond % !^$
;S#V%H&z ZhB}^K{ RewriteCond % !.*/foo-with-gif.html$
)p'Y8X/o.z$nuM RewriteRule ^inlined-in-foo.gif$ - [F]
-k%eg HO#o t !Q~3jb9W,Ac)n-dX
对主机的拒绝
/E d0mmQ&\UT 说明:m@G{)U'e$M
如何拒绝一批外部列表中的主机对我们服务器的使用?Rm4j fjA+X
1?Jo/E'Z Z"U1a"\
方案:d%C!vZ(I
代码:
Y$|7KC oYk For Apache >= 1.3b6:tbHjZ
o8LX3T'`/W+r
RewriteEngine on
i.q!Wf4J RewriteMap hosts-deny txt:/path/to/hosts.deny
!c'p'YQ~2drT-U"P3r RewriteCond $|NOT-FOUND} !=NOT-FOUND [OR]
O-JX5bl+L.[h{ G RewriteCond $|NOT-FOUND} !=NOT-FOUND
N6Ws`a+vH*OTU @2y RewriteRule ^/.* - [F]
+]8aB2vDL1V j m/hs:f `4U
For Apache <= 1.3b6:
8xu?*oOX (\L6ng _y#P$^
RewriteEngine on
f Td9s2BC3J Y RewriteMap hosts-deny txt:/path/to/hosts.deny
Is}OK$k y2M9^9_ RewriteRule ^/(.*)$ $|NOT-FOUND}/$1
#W T&wy A}_3bHh p(z RewriteRule !^NOT-FOUND/.* - [F]"AwC g:A%g)A
RewriteRule ^NOT-FOUND/(.*)$ $|NOT-FOUND}/$1T2RR,G7?9O!z
RewriteRule !^NOT-FOUND/.* - [F]
$E5vl-sF T~{:kH RewriteRule ^NOT-FOUND/(.*)$ /$1
:gc7\7uqg+@)n7M
uynm o0Z }/TX,F 代码:1^w1I(G)UR^
##
7x?&n:h!~N f*q/~GW ## hosts.deny$[P4Km ]
##
7Hk$o q%~ zA,N%nfb ## ATTENTION! This is a map, not a list, even when we treat it as such.M|SLEc+w \,F
## mod_rewrite parses it for key/value pairs, so at least a
wuk/d+U;d F|'[L ## dummy value "-" must be present for each entry.2Xi| lu@8q0BK
##
&{ t&[q/j[
5sa4W!R^ 193.102.180.41 -+rA`Ust-o+]
bsdti1.sdm.de -IW6O)I2ZS#LS)S
192.76.162.40 -x[Ea K }S:d!C#DP
:? L Nt:hJ,O
对代理的拒绝Pk6f"M3J4~Kd{-B
说明:`fR:x N3gU;?8C a
如何拒绝某个主机或者来自特定主机的用户使用Apache代理?
A-Y*f8Hi(`t c/_n n I9W
方案:
j*?8N0`ePKvc/O 首先,要确保Apache网站服务器在编译时配置文件中mod_rewrite在mod_proxy的下面(!),使它在mod_proxy之前被调用。然后,如下拒绝某个主机...aJ_1iuO,Sm

CH5Bl ``8u:@&Fm;a 代码: ^'y*o_8g"qX
RewriteCond % ^badhost.mydomain.com$
Z]%ACx7GhkR RewriteRule !^http://[^/.].mydomain.com.* - [F]
k,L.wl3y)]z%c W
TX9BTYYL ...如下拒绝user@host-dependent:
S&Y[ @ W*r.T^@tJ
/s"sX A^PhA&F&c 代码:o$G!s2Z.|3M.o;D a
RewriteCond %@% ^[email]badguy@badhost.mydomain.com[/email]$$U8S,O%yNsO
RewriteRule !^http://[^/.].mydomain.com.* - [F]
'h.m2X6Lv)`
+[*e^0U~Y9@(G 特殊的认证NbO },HHR~+w@
说明:
2^O6`9x Jlz] 有时候,会需要一种非常特殊的认证,即,对一组明确指定的用户,允许其访问,而没有(在使用mod_access的基本认证方法时可能会出现的)任何提示。iyVma5oh

A#D+[6s0B];G0X 方案:hx.`Zw%v5tu#U
可是使用一个重写条件列表来排除所有的朋友:DKC5to:y
;IU HD1YyT5a%w
代码:
?3s-jc.] RewriteCond %@% !^[email]friend1@client1.quux-corp.com[/email]$
B uA$d c5l*Vf,Y RewriteCond %@% !^[email]friend2@client2.quux-corp.com[/email]$
"tO}.|0\5r W5a RewriteCond %@% !^[email]friend3@client3.quux-corp.com[/email]$!O0w8OXL
RewriteRule ^/~quux/only-for-friends/ - [F]
u[ a*z(V;{#A| y
p7q!g&@%Y'I$P 基于提交者(Referer)的反射器
|ix'umE 说明:0k_'C(u ^(bb0E^
如何配置一个基于HTTP头"Referer"的反射器以反射到任意数量的提交页面?
N$[ R3w5\ u5X&|t5c D }Y+|3u&t%h*dC
方案:)O6d^?~k[
使用这个很技巧的规则集...Po'^(U)uy o)Z6h

A1{#v8Qa{c^ 代码: fY/b3IV-hH"JKD
RewriteMap deflector txt:/path/to/deflector.map
tVs(J%~L*NC^&~
\ e,uF/n\ RewriteCond % !=""
n4y uk:}!u4uB0m;z0M RewriteCond $} ^-$
.OZ,UW;NO0N RewriteRule ^.* % [R,L]
+eu;ap'r{i Sb8DM~a%O
RewriteCond % !="")FHV0rzV.g B
RewriteCond $|NOT-FOUND} !=NOT-FOUND0|R @l6I.c
RewriteRule ^.* $} [R,L]
.tf;]ud1E "F{t9U.Qp*a.R$N
... 并结合对应的重写地图:UK*eN$G)b,@9rx

2ln5f(V'u 代码:O5Y,x7M2{$f%z!? E
##
$sj&E U(PT3i+PM2_ ## deflector.mapw.eH1oF+k;M.R
##Wv#U&g1c&Vcv*x

-|"DS&c+p [url]http://www.badguys.com/bad/index.html[/url] -
i#tQ8V,_7]%Wg%c [url]http://www.badguys.com/bad/index2.html[/url] -.T@IKG,v7R/D(~x
[url]http://www.badguys.com/bad/index3.html[/url] [url]http://somewhere.com/[/url]
-}|,Gf+T r v2MX
"B9se9^4K em?)F 它可以自动将请求(在地图中指定了"-"值的时候)反射回其提交页面,或者(在地图中URL有第二个参数时)反射到一个特定的URL。
"pk$R&nyP
yK;Iak#L 其他
:P%YT ?k]u 外部重写引擎7E{0R$u ~QG
说明:
%G"yp+Ze9h K5] 一个常见的问题: 如何解决似乎无法用mod_rewrite解决的FOO/BAR/QUUX/之类的问题?|5r(\|Z$iT:X

o9T9vM AY0T*G5L 方案::sigjJ4om5VC-\
可以使用一个与RewriteMap功能相同的外部RewriteMap程序,一旦它在Apache启动时被执行,则从STDIN接收被请求的URL,并将处理过(通常是重写过的)的URL(以相同顺序!)在STDOUT输出。
-G~ u*?W-O(c'TB A6ec,J9^ m.?
代码:
,H&pVn t7ty)k RewriteEngine onR+C3k0{;W
RewriteMap quux-map prg:/path/to/map.quux.pl
_EY%y m&V8c B/O RewriteRule ^/~quux/(.*)$ /~quux/$
9}pL2m l (Oa~(d~5H s,n6[
代码:I+^ Tu6}(l `a7O @
#!/path/to/perl
n}Ozz.rG/|
wP T2[l # disable buffered I/O which would lead
*L{Sw8hg,T4mw # to deadloops for the Apache server
:x6Hp3{;hW } $| = 1;
w fb:SNwT rCx\5|
# read URLs one per line from stdin and'F_:I-I&{so
# generate substitution URL on stdout*`(|K#mx?5^
while (<>) {
m4TC}&U{ s|^foo/|bar/|;,MRgdT j9R"b9~M
print $_;i3j'WaO(M1s8o
}Gjxiwf3mxYkN
'@:M]'@GV
这是一个作演示的例子,只是把所有的URL /~quux/foo/…重写为/~quux/bar/…,而事实上,可以把它修改以获得任何你需要的功能。但是要注意,虽然一般用户都可以使用,可是只有系统管理员才可以定义这样的地图。

game365 2008-3-1 07:09

学习了:D :D :D

heesf369 2008-10-26 09:03

写得很棒

我上中学的时候。同学看我长的黑。班里有个白马王子。于是。给我起了个外号叫黑马王子。到了中专。我的脸有黑边成红了。外号变成了[url=http://chuanqishijie.fsifu.com/]传世私服[/url]红脸关公。
F9w y3X.iB B 我们原来的[url=http://www.heesf.com/]传奇世界私服[/url]数学老师,人很好,很认真,就是软棉棉的,大家叫他,老棉花,他的科代表,也软棉棉的,故称,小棉花,都是男的。 ^%\B.Z p
大学一老师,关人甚猛,称之“大砍刀”;另有一[url=http://www.igqb.cn/]今日新开传世私服服[/url]老师,留洋博士,甚厉害,出题古怪,骂人不带脏字,却能让你胸闷好几天,谓之“小飞刀”。
+G9]6C ~9B-g2f)s 办公室里,王姓同志多,某小同志排行[url=http://moyu.fsifu.com/]传奇私服[/url]第六,谓“王六”,不日又新进两王,小同志终于排行第八~~~~~~命苦啊!
1T7so \blj!}3d:i 上大学时的老师,根据各人监考时抓作弊的成绩,分别称为“四大名捕”,“四大杀手”
] `sGl!bJ 这个就不是外号了。是真名。苟成群。如果谁理解的不太清楚就成狗成群。
m!Y:zVe[nTC 我还有一个老师,教教育学的[url=http://www.igqb.com/]网站排名[/url]说只要你背的多,就会考得好,所以,我们叫她贝多芬。
_,Z sL| 偶单位有一同事叫崔昌富,人称“娼妇”。
:\:\W/I.TleZ)p1I 我的高中化学老师,长得特别胖~~~我们就叫她“化肥”。

ijkl178 2008-10-31 23:51

不错

不错.d!O#Kq;]'Yc

W,Q}gX7u7Ju
u'N*]Q#Z)Z5l ......
#JKrp1PwR
ss,gR&?b Wt \4|8D8M?so6~mZ

#}C [!G#f|P             ~~

f4g546521 2008-11-10 16:16

不错,顶起来203

不错,顶起来!N0LD!Y-uzi+o:kc

5A%w0dD,e*l~G [url=http://www.88324639.com/article_view.asp?id=153]榨汁机[/url]
8bk v5~$Df0r ~ [url=http://www.88324639.com/article_view.asp?id=153]商用榨汁机[/url]
{6nRtSk:WjrN [url=http://www.88324639.com/article_view.asp?id=153]多功能榨汁机[/url]

longmingc 2008-11-14 15:36

军事笑话

第二次世界大战期间,德军占领了巴黎。两个纳粹军官走进塞纳河畔的一家旅馆住宿,而旅馆老板是一个热诚的爱国者,对纳粹十分厌恶。纳粹军官傲慢地环视四周,道:“这个猪圈!住一宿要多少钱?”老板回敬道:“一头猪100法郎,两头猪要200法郎。”V`X8WvCA-zMDU
[url=http://www.uu7r.cn]www.uu7r.cn[/url]

shiliao528 2008-11-20 00:03

笑话,法 家

无赖子怒一富翁,思所以倾其家而不得。闻有茅山道士法!r_G%j D!^$Q
,_bKqqRN0q|_7R
力最高,往诉恳之。道士曰:“我使天兵阴诛此翁。”答:“其
o)p/o g]g7N1P X /?9uR DQ FzW0h}9C
子孙仍富,吾不甘也。”曰:“然则,吾纵天火焚其室庐。”答
,Dm/n ~$[[+[$PS
plSV4_])YL g 曰:“其田土犹存,吾不甘也。”道士曰:“汝仇深至此乎!吾
sj{8EPc #K iw0A6Su;R
有一至宝,赐汝持去,朝夕供奉拜求,彼家自然立耗矣。”其 ca NW5r@"?-L

:d[i$e*^a5d],t n 人喜甚,请而观之。封缄甚密,启视,则纸做成笔一枝也。4FYm0lN3}

Ku;Ix)iS6I 问:“此物有何神通?”道士曰:“你不知我法家作用耳。这纸
'}{3USz l ;Y?(soi
笔上,不知破了多少人家矣。”SqqH1|I9h:b:X

{ \l|Uf
}0QLT]"n b5E
pJ/o ?/Y+H2sU K hu|#H(pn(O&l

h~V.H o!D&V'M
P:}#d|o#F];P
F7G}M\L`H!k :dMTd-Fh

1l NEbcFV ,t L4j&g;d5wQ
  [url=http://www.zzsszz.com/004.htm]反击式破碎机[/url]  [url=http://www.zzsszz.com/]破碎机[/url]  [url=http://www.zzsszz.com/004.htm]可逆反击式锤式破碎机[/url] [url=http://www.zkjxc.com.cn/4_eshiposuiji.htm]细碎破碎机[/url] [url=http://www.zzsszz.com/huizhuanyao.htm]节能石灰窑[/url]

mnop808 2008-12-1 22:21

求购球磨机 球磨机厂家

[url=http://www.zkjxc.net/fuheshiposuiji.html]求购球磨机[/url]    [url=http://www.zhishaji.net/]球磨机厂家[/url]
页: [1]
查看完整版本: url重写apache rewrite全攻略
Gustav Klimt      Tamara de lempicka     Abstract Painting