如果你的虚拟空间支持 rewrite,那么你将拥有多个网站,请看下面的配置
% q. t7 e# e) Z6 a9 MEmulating host-header-based virtual sites on a single site
# R: S: q0 s5 y5 Z+ X' N例如你在两个域名
注册
www.site1.com 和
www.site2.com,现在你可以创建两个不同的站点而使用单一的物理站点。把以下规则加入到你的httpd.ini
文件
6 d! ^9 a2 J) O* G# J2 s% l
. ^0 e, v9 Y$ y2 O7 I/ H |[ISAPI_Rewrite]
% G+ A$ B* t, U. X: t$ ^- Y* A* X; ]
8 V( k2 f/ K, p#Fix missing slash char on folders
, m& B3 | n2 T3 d t6 e
+ ], e; A6 c; f. z$ [7 I) Q
RewriteCond Host: (.*)
3 k; B0 t# t5 B
' K# Y. D5 H" Q7 mRewriteRule ([^.?]+[^.?/]) http/://$1$2/ [I,R]
( r# s( e2 ?. L( /0 L' e3 g3 H
4 O) c; {! a" f/ /2 v#Emulate site1
# P* f7 S; e( u' a' m
& ^+ c! ~" J Y, k9 }
RewriteCond Host: (?:www/.)?site1/.com
/ K# V* f0 `8 H. ^5 /
; F+ I/ [1 y3 J. v
RewriteRule (.*) /site1$1 [I,L]
9 I4 f* Q( j2 S( R1 G' M8 Y4 }5 I
4 y$ ^( v* h7 I" s: l9 M- s" k#Emulate site2
# n- L& r, E& s5 C$ C% R7 f2 F- x7 O
# ]. o! ?. R+ W, e, @% M
RewriteCond Host: (?:www/.)?site2/.com
6 K2 l6 N2 b! Y) p6 `
8 w+ c8 O* ~; T) I5 ~2 f
RewriteRule (.*) /site2$1 [I,L]
+ B' H h1 {# V% R& [8 W
% Z. g. `( ]5 }
现在你可以把你的站点放在/site1 和 /site2
目录中.
- R" T3 e9 S" k3 a
. F0 h% s7 z# q- N
或者你可以
应用更多的类规则:
' G( {# |: p$ b: ]6 x3 @8 ~5 N
' j' H6 Z! R8 p2 Z[ISAPI_Rewrite]
9 b+ t7 R+ Y; O8 x% P
0 U, |/ Z1 q1 a9 M. N4 t+ K#Fix missing slash char on folders
! ^* Y9 N7 [$ Q% Q# T: O
9 B2 y+ W5 y3 _, k" h" _RewriteCond Host: (.*)
" r$ B# V$ @. b" l
/ R" /5 g _# W6 a2 Z0 B8 `, zRewriteRule ([^.?]+[^.?/]) http/://$1$2/ [I,R]
! e6 K: c+ e4 i" N8 j2 P) y
% x$ s$ ?" g: W. ]4 t d, }' }+ hRewriteCond Host: (www/.)?(.+)
' D+ [( b& /6 S2 ]
8 ~ G5 u7 J5 e3 {" Z
RewriteRule (.*) /$2$3
- H9 S0 k2 x: ?6 F+ [5 c3 `
! i2 [; U' v7 p) B
为站点应该命名目录为 /somesite1.com, /somesite2.info, etc.
! h# f- q0 j& /8 G+ K
& n5 b2 Y0 {8 t. d8 n6 tUsing loops (Next flag) to convert request parameters
6 A) T! G4 C5 |- U9 z7 F
' Z# b& |! Q* X3 q3 E" C假如你希望有物理URL如
http://www.myhost.com/foo.asp?a=A&b=B&c=C 使用请求如
http://www.myhost.com/foo.asp/a/A/b/B/c/C 参数数量可以从两个请求之间变化
9 ^1 ?0 I5 C1 g% l1 H
! G1 U8 t D) M至少有两个
解决办法。你可以简单的为每一可能的参数数量添加一个分隔规则或者你可以使用一个
技术说明如下面的例子
* F( j2 I' @# F
, P! o' O, U {% ?2 l6 W g6 ~ISAPI_Rewrite]
) U% U% ~$ [( y3 C1 z, l
+ q# K& /3 m' l# R) y4 _7 ?
RewriteRule (.*?/.asp)(/?[^/]*)?/([^/]*)/([^/]*)(.*) $1(?2$2&:/?)$3=$4$5 [NS,I]
$ W" y" K6 q" Q4 t* u5 s
0 R+ O w7 B7 Z# w这个规则将从请求的URL中抽取一个参数追加在请求字符的末尾并且从头重启规则进程。所以它将循环直到所有参数被移动到适当的位置,或者直到超过RepeatLimit
' ~/ X' [; L1 j- X( u2 k! e. W2 h- t
6 A+ U4 p( F- O/ b M& G
也存在许多这个规则的变种。但使用不同的分隔字符,例如。使用URLS如
http://www.myhost.com/foo.asp~a~A~b~B~c~C 可以应中下面的规则:
% b. d) E/ A6 H+ @
1 X* G; /( N3 f8 _0 x7 k& dISAPI_Rewrite]
' [/ U$ @4 h3 C* P) t& z
. O. e1 ~- L9 l3 {( B- m" e! d( J
RewriteRule (.*?/.asp)(/?[^~]*)?~([^~]*)~([^~]*)(.*) $1(?2$2&:/?)$3=$4$5 [NS,I]
$ ~& x( [% u/ H
7 e- x# h% w% Z0 l% |
Running servers behind
IIS
& K4 M* M. b: g% s. B
! e# o3 w( D3 u( ~9 l" N! k* W假如我们有一个内网
服务器运行IIS而几个公司
服务器运行其他平台,这些服务器不能从INTERNET直接进入,而只能从我们公司的网络进入,有一个简单的例子可以使用代理标记映射其他服务器到IIS命名空间:
: G! e( P3 a3 s3 b
+ r8 ^ U$ y$ q6 Q# a( P
[ISAPI_Rewrite]
7 ^- n0 }" e% t+ E5 p* /3 p
6 l- A* T2 D& w m2 O
RewriteProxy /mappoint(.+) http/://sitedomain$1 [I,U]
! g: o# a: R/ ]4 W
, R+ y5 p4 S$ M$ P5 Q+ I- TMoving sites from UNIX to IIS
# T% L. e8 E* m4 `0 d
& D# n! L3 d7 E# j7 s6 W
这个规则可以帮助你把URL从 /~username 改变到 /username 和从 /file.html 改变到 /file.htm. 这个在你仅仅把你的站从UNIX移动到IIS并且保持搜索引擎和其他外部
页面对老页面的连接时是有用的
' S/ S0 {- B/ e. q; z
7 H/ u9 m& G& V6 c8 A% j [: ~[ISAPI_Rewrite]
' W3 T. p1 I4 B' L% {% Q2 J3 T
" y# /9 R& N/ {" N( o; u* J, e#redirecting to update old links
1 C5 S* G; U: _* J, W
8 F8 R: g" K1 F' V3 ]' |RewriteRule (.*)/.html $1.htm
: m /9 C, t9 u4 I& R7 l
5 u; n1 e+ O" d' ?% l+ B
RewriteRule /~(.*) http/://myserver/$1 [R]
8 }2 w; {) H5 |: z4 {
0 p) Z9 a! f) w" /% _& GMoving site location
' i3 A% U- ~( N. R
% a. I# }3 o( {& [, _许多网管问这样的问题:他们要重定向所有的请求到一个新的网络服务器,当你需要建立一个更新的站点取代老的的时候经常出现这样的问题,解决
方案是用ISAPI_Rewrite 于老服务器中
: l$ u/ K. D7 a5 X" D
; W. f+ W9 t S[ISAPI_Rewrite]
' F$ |8 q9 X) c4 a# Z+ ^5 W: u
( t2 R+ X3 H' [
#redirecting to update old links
4 u7 p! f2 g6 _! j+ F# k" b1 U
. C. b. ?% [* [& [" r
RewriteRule (.+) http/://newwebserver$1 [R]
1 }8 `" |* P V8 J
% q4 m8 [2 A; [( }7 M4 c, ZBrowser-dependent content
! t0 z0 M& F. j6 m5 x' b: H- T0 t
; O7 @' z: _4 M2 T
Dynamically generated robots.txt
2 h( }* D6 b' C4 W P1 Y( R0 |+ o: Y
. E. N( [' t/ E" U1 P
robots.txt是一个搜索引擎用来发现能不能被索引的文件,但是为一个大站创建一个有许多动态内容的这个文件是很复杂的工作,我们可以写一个robots.asp script
! W" b- ?" L7 _
# C* ~$ R h* I& T. k' /& `
现在使用单一规则生成 robots.txt
6 a0 g6 z$ W- n3 w! U2 F
2 D/ E: ^' y, U; Z. r. w
[ISAPI_Rewrite]
+ y E! A6 x, T( Z9 B
C& ], k) R" q& z
RewriteRule /robots/.txt /robots.asp
9 U% {" G, B9 n
) a* q# R" ^& Z! t2 B
Making search engines to index dynamic pages
* C1 ?- o* K7 f' Y# |. N
% y9 {* w% X! V. X! E
站点的内容存储在
XML文件中,在服务器上有一个/XMLProcess.asp 文件处理XML文件并返回
HTML到最终
用户,URLS到文档有如下形式
% O0 x8 N/ /2 L1 s$ b
e& H4 g8 g; Y' C- o
http://www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml
- A& L8 x! y& e; |
( V$ d) L6 J' X/ W1 z6 y但是许多公共引擎不能索引此类文档,因为URLS包含问号(文档动态生成),
M( M# b2 W6 u$ Q2 b+ O+ w
! A0 r1 B. ]% i% J; ?# wISAPI_Rewrite可以完全消除这个问题
& Z8 k6 S8 W- ?; X
/ ~6 S( d H. a6 O& y& J7 }
[ISAPI_Rewrite]
. h5 E5 Z9 |# b& W( [2 p
O: R( V: E, a! t. P% q3 X8 O- MRewriteRule /doc(.*)/.htm /XMLProcess.asp/?xml=$1.xml
$ e% j5 S( c/ I2 _% d
& t1 e; N. b; u' t( {' g/ f
现在使用如同
http://www.mysite.com/doc/somedir/somedoc.htm的URL进入文档,搜索引擎将不知道不是somedoc.htm 文件并且内容是动态生成的
9 C2 u: `0 `7 o8 n. |" ^8 { B; ]7 ]
* {3 H% L$ R% T* i1 v+ o! h9 ONegative expressions (NOT
" I3 Y/ d3 /7 T7 X( // K) S
1 u7 j. g! q& b: F2 O
有时当
模式不匹配你需要应用规则,这种情况下你可以使用在规则表达式中称为Forward Lookahead Asserts
* d9 N- @/ X6 @5 N
3 G! J) W1 e5 ^# V7 O7 f例如你需要不使用IE把所有用户移动到别的地点
8 r- u4 P8 {& @/ @* a
0 G" C$ I4 n) T* L. J! Y9 R
[ISAPI_Rewrite]
8 x/ O: k. h; k2 W) k! K; M
/ r; J2 e3 a& F4 w) I" l8 l
# Redirect all non Internet Explorer users
2 M# C0 n& ?1 l0 o% l6 a
7 J) p$ I/ k+ z+ Z
# to another location
3 t: N3 U4 [4 x8 v# _
- m4 m7 t G5 b# L- Z; s
RewriteCond User-Agent: (?!.*MSIE).*
+ M( t( [/ r0 u( S5 /) }' }3 e% h& ~
! {; g+ j1 q$ x* ~: U. l9 D+ O! _
RewriteRule (.*) /nonie$1
/ V X/ Y1 k) i2 @
( S6 A6 C: D, ^ V( D; {Dynamic authentification
7 {) s# Q0 H4 P1 F+ `' v
$ d- D% N8 E6 L7 R3 A例如我们在站点上有一些成员域,我们在这个域上需要
密码保护文件而我们不喜欢用BUILT-IN服务器安全,这个情况下可以建立一个ASP
脚本(称为proxy.asp),这个脚本将代理所有请求到成员域并且检查请求允许,这里有一个简单的模板你可以放进你自己的授权
代码
/ C, F$ R; j v7 O. z% n
4 @2 W# }; y/ p0 n) P l现在我们要通过配置 ISAPI_Rewrite 通过这个页面代理请求:
* F+ y9 F% |' c! e
# o" @ @) X! M5 V! p[ISAPI_Rewrite]
+ V. R$ }6 X' ~
2 W* Y7 /" g9 f, b+ g' K, e
# Proxy all requests through proxy.asp
# F+ ^" G. J0 p! @. d; ~
. p& v0 d, _3 s- {7 DRewriteRule /members(.+) /proxy.asp/?http/://mysite.com/members$1
/ Z# S2 K+ {' M9 L* X' `
# ] }+ ^$ l2 U/ j保护图片 防止盗链
+ z# F+ q2 z. z# H( ?5 l4 a, O
Blocking inline-images (stop hot linking
" E0 e( V/ y, B
0 |+ `% G c9 e* _) p' B
假设我们在
http://www.mysite.com/下有些页面调用一些GIF、jpg、png图片,不允许别人盗链引用到他们自己的页面上,因为这样大大增加了服务器流量。
6 n) J) w( y( G7 o n当然我们不能100%保护图片,但我们至少可以在得到浏览器发出的HTTP Referer header的地方限制这种情况,因为这个可以判断是否我们自己的站点调用了我们自己的图片。
$ D- ? Y3 k8 `' W2 Q
: q' x. _3 L( P$ X# `9 e F' O[ISAPI_Rewrite]
: |9 ^6 } z( N
' W5 {+ p) |, d5 u& s+ b; iRewriteCond Host: (.+)
9 l6 M( z2 s' @5 m1 }( I+ c1 k. f
3 w3 ~4 {; N) W6 V# C5 YRewriteCond Referer: (?!http:///1.*).*
g3 x. G( A3 R
( N1 R /% ]' Z5 X! |$ U
RewriteRule .*/.(?:gif|jpg|png) /block.gif [I,O]