|
.htaccess中的apache rewrite写法:
" f9 ~. a$ A5 I' X5 x
6 s) r1 a; N2 s& M5 p [size=1em][size=1em]- , _3 U% \' Z( }* e
- RewriteEngine On K: h' F2 n4 K/ z; T) \# b; q; E
, ` o6 }2 R' X) q$ z- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
8 O7 V5 v. g' @% c0 R/ o
4 w- j3 P# N. u% q' @; r$ A% F- RewriteCond %{REQUEST_URI} !^/blog/
2 L6 y( f1 R, G' u
8 p4 f0 n7 K* h) k5 e- RewriteCond %{REQUEST_FILENAME} !-f
) x/ _) C/ R( N: C. ~2 ~" s% [/ _
. D7 i' u8 s: ?- y: c- RewriteCond %{REQUEST_FILENAME} !-d" P0 D( F+ o) P5 R; w& a6 V
- , W/ _1 k+ ?! S7 F
- RewriteRule ^(.*)$ /blog/$1% s7 t' U. ~) N* q3 h
- / \3 @+ P9 h0 F9 y' j! y
- # 没有输入文件名的默认到到首页
6 h& I9 A' n' ^8 \) k! Q- } - , z+ p( r/ G, h; X8 t
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
6 [& g, r' m& Q: i( D
! z. q) q& ]: C* q! T0 `& Y6 {! A- RewriteRule ^(/)?$ blog/index.php [L]8 A1 \8 G2 L/ W3 G, J* c. [2 [
复制代码
* M. F$ y! H" | K! k+ U
2 v0 e4 s" g! x `0 P/ Q) R2 g( F, |/ v
% p, i! o i$ }: i/ x
' C! L4 z t" b. F
* @8 @6 l' y# a% ~下面我开始解说一下上面的意思:
9 _' m* g) U8 Z4 n/ T
, B6 W* @* B, X7 j/ M【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。4 z: r! D+ a a5 H! X/ |) s
- U, p1 X! k: `$ w' \【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】: z4 ^% z2 D: y0 v3 X
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。2 ~( y ~" C$ O5 G3 o# b$ V
1 z+ f# p2 F+ U; h# c' W
【RewriteCond %{REQUEST_URI} !^/blog/】
2 x7 j/ K# s) M7 l0 w4 m也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
* s: H4 K9 O: D4 m; U( n; u N' J
' X% u' ^! y# A! D3 U C6 I( n【RewriteCond %{REQUEST_FILENAME} !-f】
( w* d0 @+ ]" G- x; M4 }【RewriteCond %{REQUEST_FILENAME} !-d】+ E$ \! u% Q. X6 S( ~7 o4 `% ]. H
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
; H% u8 P' d4 {& |; C) j( l" L: D+ M7 v4 M1 w
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。# s% ^! V! a1 l* [! I, l
( P4 G# P, ]5 F5 u/ M7 |# Q【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
1 Z. D0 U3 b; [2 r/ i$ v【RewriteRule ^(/)?$ blog/index.php [L]】- C7 L- i# R! `5 Y6 Z& X* B& L3 T
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
8 g6 G( a* S# v3 ? }: \3 t. O) b% K, G
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
) N8 Q1 ]6 X3 f- H& z/ b6 G3 e/ P答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:$ O' K& \* d& t4 R. r
RewiteBase /' X% B, \/ v1 Y% {: d M$ S
! w) \& E3 z) f) e1 c, q$ [( X* S还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
x0 V: l1 H4 w) V6 D! L% w2 r至此,完整的语句应该是:
8 Y6 w& J4 d u- a" o; P% f+ x6 z: F! L9 f2 B/ s; {" d4 K
[size=1em][size=1em]- 1 A2 |- Z" b* v* B$ \
- ####start####
) _5 P. F7 ~) |+ _, v - ! K4 J1 |3 ~2 M. z
- RewriteEngine On+ G. t; c! x+ T! l* _) q. g# I
- + t& m+ V% ?: `4 P# P( A
- RewiteBase /6 r! p. z3 A+ F0 b3 k8 q
0 Y \2 h" H7 E7 P, Q- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]. S; h+ I( w; Y! B* E
2 A- |; p' W i# `4 [- RewriteCond %{REQUEST_URI} !^/blog/7 ~4 B7 V! X Q1 W# @0 Y/ ^0 @
- ) @* Y2 n% w/ W6 |
- RewriteCond %{REQUEST_FILENAME} !-f
: ]$ G" @, |2 u) b: W
7 r% N1 X+ I- A* X- RewriteCond %{REQUEST_FILENAME} !-d1 U, j0 r0 X& |0 M
1 j! x( b; P/ u( @1 |/ E, ~# r/ H7 W- RewriteRule ^(.*)$ blog/$1+ m; _ |- _' _2 a5 M4 Z8 M0 Z5 {
- H6 n/ v& K8 H a- # 没有输入文件名的默认到到首页' ~: y6 K: C, Y% a
- p- e: V7 k4 D. R. W' V- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
/ H5 w. e6 u' P! Y. A
9 Y. f8 d. G* D) K1 M p- RewriteRule ^(/)?$ blog/index.php [L]/ k, v7 R( s6 h& j+ i6 o- n4 ]
# |( x4 O, m; x; Y' N0 K! [; d- ####end####
V2 A" i# P. z
复制代码
4 v& b4 A1 M/ [) d
/ L8 w( q1 F; b4 ?; e# ~# x6 N, F2 V$ S: n4 ?
b4 [' d2 c* R0 @' A$ A. b
- c/ G9 W+ n r
- t: S# U( @6 A; E8 F如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思! K" U0 y2 y" m& l+ U7 o% _1 t
6 _. q9 v( Y; b$ I* s$ T
防盗链的语句,同样需要添加RewiteBase /,如下:
# N& x8 d2 o" Y5 j5 \" B
3 F( }5 U. j& q; O8 r7 G1 s [size=1em][size=1em]
3 L. d. }+ C5 V3 _& b" F$ W( Y4 f- RewriteEngine on
- d8 n; \2 C' Z - 8 U% K4 r% f$ n" I) n7 b5 n
- RewiteBase /2 ^5 e2 w# E) q: P0 @
- ) Y7 P- d4 e$ m5 I. M
- RewriteCond %{HTTP_REFERER} !^$ [NC]
S: E% ^* h7 G0 d4 \! z6 m
/ @; a8 p3 g! |; y* X2 V0 q6 M- RewriteCond %{HTTP_REFERER} !xxx.info [NC]$ P* o/ G5 T2 p* B
4 f% N2 A, D) l- RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
: o3 N- Y+ n" }4 ~( M3 z6 v" ?, u: }! C
复制代码
5 U/ }5 J; K* O& }" r6 a0 A) q7 R4 P* a
5 k) |' f6 n+ N$ D
& n3 @$ W1 W* q3 O5 [- J; Q4 G# K' r' |" ]1 \ w3 @5 i
! `7 B2 R9 v. y, y# p8 `: K如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
- T1 R0 d: J" `/ ?. o; L) s& y& x3 t2 C# ^' @' T1 J% ]
下面附上简单的语法规则和flags:
0 o; C3 r% N, V! P& C Y8 S2 m+ C【RewriteCond语法:】9 O) `: h0 i6 i
RewriteCond TestString CondPattern [flags]$ q/ Y5 H! U3 I) z; R( R
rewritecond的其他用法:
* N6 x' x2 ^8 t/ }3 x‘-d’(目录)9 \; v) F# c4 }4 z1 D% w7 B
将TestString视为一个路径名并测试它是否为一个存在的目录。
4 T# l+ M1 r9 P% R‘-f’(常规文件)9 Q5 w/ \/ E" w5 ]
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
& d. R( q4 v& @/ f‘-s’(非空的常规文件)- ?- R, l; A3 a4 g- Z* C' U
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。$ d# u0 i6 ^( k' b+ q/ @, d
‘-l’(符号连接)
5 a+ |! a$ [* G% W6 m3 D" v将TestString视为一个路径名并测试它是否为一个存在的符号连接。$ A! c/ F. o0 v: }; \5 }
‘-x’(可执行)
. n8 ~' Q& q# @- k将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。: o L( s I% z9 J+ b
‘-F’(对子请求存在的文件)# q- R& u2 u) I. r* n
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!, `$ ]) P9 E B9 n5 z% o6 ~' ^
‘-U’(对子请求存在的URL)
; c4 _# z) V) j0 d* e) {1 D检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!; G* p+ h+ j% g
1 O5 A/ O: g$ U【RewriteRule语法:】4 [# }. d' E0 H9 C% j% I. P/ M
RewriteRule Pattern Substitution [flags]
* v6 u) [& l! a: C, l7 ?% ~ t2 Y" K& K2 M3 [* F
【flags】:
. t4 J, ^2 p) A9 x7 s
, w& u% Z" ~( M! D‘chain|C’(链接下一规则)3 j$ {1 L3 g7 n) [" H0 o. m
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。 r- g5 \3 x6 }
. ?8 p3 @3 U! E; q( u; U5 {‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
5 @& E, X @$ X, @6 M, I! N+ W G# J在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
* G* Y% N( K3 m/ Z. y. e6 \
; Q3 w* S/ z4 T' X- x‘env|E=VAR:VAL’(设置环境变量)
! `8 h9 Y9 z9 N" C- R) {此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。$ ?1 b/ Y' Y9 o K
) p( K: V, f! w; ]8 {; U‘forbidden|F’(强制禁止URL)+ x5 I1 H9 p& c& P5 O
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
v! X L6 V3 i/ ? {8 @0 M& V+ ^. n2 q t1 q& m4 z8 B
‘gone|G’(强制废弃URL)
4 S& W* k, T: e4 R7 d强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。) I3 ]4 D* {. I: O7 f' @- I6 y
+ E2 n, r% Q6 A7 [9 |) O
‘handler|H=Content-handler’(强制指定内容处理器); l" A2 T0 q4 G$ v2 y
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。 a; p# z, t* i. @. Y1 o0 n
6 s: G+ O1 L( k‘last|L’(结尾规则)6 u! Y6 ?: j# o2 Q
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。: P) Q/ l/ s+ a/ D* E6 o M9 b
1 ^4 V2 E# F( r2 v‘next|N’(从头再来)
. B3 v8 y1 \! ?重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
$ @' n. ]4 e/ T7 H, D3 Y- ?% k
2 e4 K& b3 j6 {# }* a3 P& `‘nocase|NC’(忽略大小写)
, e6 X+ k! O5 |- y+ z$ \它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
7 t( v3 T/ a8 S4 @
3 |: V# U7 Z% c. M‘noescape|NE’(在输出中不对URI进行转义)
( h4 a* a6 ^# n7 u" S. L此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如: T/ }, X: s3 L% O
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
* r# t3 X5 O7 i9 {: u. r, s) t. S可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。9 `0 `! K9 b8 l; H4 k/ g
1 v. z- ^2 e4 o: U: b# `
‘nosubreq|NS’(不对内部子请求进行处理), x- u! v/ P) m* N
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。8 e- U) B+ V' ^+ h; v
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
; y+ t2 I. T7 @2 x0 _- v; U
6 Q4 A1 ^) t1 s# M‘proxy|P’(强制为代理)
! r$ m2 Q+ R, a+ g/ r8 j此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
V% z# G( N2 E7 L注意:要使用这个功能,必须已经启用了mod_proxy模块。; m" D$ r3 S, `; O2 _: n
! b" h' B9 Q! {1 {% p‘passthrough|PT’(移交给下一个处理器)
/ u' g& Y( p7 d: ^8 F6 v5 @此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,这个小小的修改使得RewriteRule 指令的输出能够被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的例子: 如果要将/abc重写为/def, 然后再使用mod_alias将/def转换为/ghi,可以这样:
( r1 v* W* \5 E( ~: A$ L: ?RewriteRule ^/abc(.*) /def$1 [PT]# G* E) }& a7 ~. y
Alias /def /ghi
& y3 U5 B: w0 C+ n: u( Q如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。9 r( c9 [/ a8 j! i2 M
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。6 [( E* |. s& C& |7 I7 M6 h `
; E p4 F8 G' ]! I
‘qsappend|QSA’(追加查询字符串)
2 m& d! L/ w$ b* \5 S4 j9 @此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。* p6 n7 G' C% J4 T. Z3 b: I+ b
9 h* e0 c. R8 w" z( X" z) [‘redirect|R [=code]‘(强制重定向) r8 }$ L" y" Q) G* R3 m
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
5 V' @& g$ e; n3 y2 u/ U) V4 n注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。; e& V1 z- x# T2 S) l* L/ {" o& f
# l- N# f7 e1 k3 p# y( L
’skip|S=num’(跳过后继规则)
' Q! G1 n" x: p8 q. v4 y此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!) e( {* @4 v# v8 R" }" q
8 T$ m% e& r9 {! @3 ^
‘type|T=MIME-type’(强制MIME类型), W8 Y( R# [4 y
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
3 N" Y2 ~7 z# i+ e6 B7 wRewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
0 z) K: G. `# ]5 O3 F! ]5 W& U8 Q
& f. s5 n1 z- ~! i9 i; V# T如果熟练掌握rewrite规则的编写,能够加强对网站URL的控制,对用户体验、SEO都十分有利。 + |% d1 \& B" k
一、防盗链功能1 g! B& b: _* r B. d& p, {
[size=1em][size=1em]
: Y" F. v) y2 S6 f# E% \; k- RewriteEngine On
' T6 f: a0 z ?" P* n - / @6 v1 {' v3 o# o% X$ Y# x% g
- RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
3 `$ S3 z s( }: s/ ] - 3 g4 I- @. ]1 o! h& v1 _2 L1 p
- RewriteCond %{HTTP_REFERER} !^$/ ?% m2 e5 o. X; v8 J
- * m7 C, \; h- H* u% E
- RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
8 y! `: U& p T
复制代码
$ Y' X M [5 T; B2 D* [3 s7 v6 w- D/ d) V0 T- z8 C0 j3 E$ y
3 E; G( p+ g. \7 i9 T( M+ f5 Y7 @ ]$ |, v
& Z- k( L1 q0 ]& ~$ o3 g- r" C" u! Q- K. B: r
逐行讲解一下:
/ L+ J$ _0 s; R2 q1.打开Rewrite功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。 2.RewriteCond指令,定义生效条件,用于寻找匹配条件的地址。后面内容用正则表达式匹配。代表含义是发送的请求不由mysite.com而来,那就是盗链啦。末尾的[NC]代表忽略大小写。 3.发送请求的主机前缀不为空。 4.RewriteRule指令,定义重写规则,把匹配的地址按此规则重写。本例中把这些后缀为这些图片格式的,都替换到某一个图片下。[L]表示这是最后一段规则。
8 `/ d; C" A' X. j: N. f只这四行就实现了防盗链是不是很神奇,编写起来是不是又觉得复杂。 这里总结了几个常用参数(不是全部): / @1 D6 A& P$ h( ~
RewriteCond下: [NC] 不分字母大小写 [OR] 用于连接下一条规则
c. o% m( D3 D1 V6 iRewriteRule下: [R] 强制重定向,[R=code] code默认为302 [F] 禁用URL,返回HTTP 403 错误 [L] 这是最后一条规则,之后内容无用 : v. h) N: O) d8 c
还有一篇关于正则表达式的教程(很详细): http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm a* E1 V- j' u/ D$ Z# S9 u. \
二、网址规范化 [size=1em][size=1em][size=1em]
+ o: e% ~% F5 k3 {- Options +FollowSymLinks$ V" _8 [1 D8 ^. ?
- ! ^3 S" X1 `. _( q
- rewriteEngine on1 F5 A2 `' k' N7 w b0 E
- * z& c6 k: l3 ~* b9 W
- rewriteCond %{http_host} ^yourdomain.com [NC]
* h+ A% t2 i8 X& a& v& `5 e
7 E- _! k& W4 C$ C( I- rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
1 S. j& e8 k6 G1 L) o# I% c
复制代码 ; @1 b8 N4 a5 v2 o7 N4 D' F {) y
: J- K3 E C( V
4 L4 i$ E$ ?2 y- M$ z& V
+ i; B$ @/ Y4 Q! \( {1 Z9 h- D8 }3 [3 E0 t8 l/ m* w
) W7 F# |+ J' k$ M' a9 k* K2 y这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了? 需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。 * a* I# k( }6 m4 b7 z
再来看一个好玩的重定向,把google蜘蛛指向某个网站 [size=1em][size=1em][size=1em]- % r: T5 B0 U2 n) C" `% R
- RewriteEngine On
3 G, y$ N! n/ P b, v% J - 8 `8 V- v# o$ i
- RewriteBase /
( p- {7 e# q- o5 c - 7 C/ Q4 R# ?3 d6 |$ X( s( F
- RewriteCond %{HTTP_USER_AGENT} (Googlebot) Z W! `' z0 |7 R i( h1 t! J: r3 a
# {; m( v3 P+ X0 `: Q- RewriteRule ^ http://abc.com/ [R=301,L]: t0 Q6 Z$ F* U% V# v' @
复制代码
2 W i' p7 D# ?8 s7 }1 j R8 b5 |
8 @! u; e2 _$ R$ E
: t [; M5 O5 m& A( P* J* d4 w4 L+ S! J! g2 W0 F+ u E
* x1 @1 D1 a1 P' l
2 y# X4 n& ?4 Z6 O1.打开Rewrite功能。 2.RewriteBase指令,设置目录级重写的基准URL。可以理解成把该目录(这个.htaccess所在目录)假定为基准的URL前缀。本例中这样的写法无用。 3.RewriteCond指令。匹配所有USER_AGENT为Googlebot的发送请求。 4.RewriteRule指令。本例中把这些请求都重定向到了abc.com。
1 x, a0 _. M- l在本例中,这个配置应该是黑客所为,把google蜘蛛指向某个网站,等于伪造PR。
6 E: B* {2 x/ `# a3 B$ o% ?5 U* z三、临时错误页面 # t0 z0 @) f. y( S' y- q
当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。 这时我们做一个302转跳就好。 [size=1em][size=1em][size=1em]- * X0 C" y5 O. b) |6 Q7 i
- RewriteEngine on6 v g( s/ O6 H4 k3 ~% a8 {. r+ I
- . `6 u2 b& X/ l2 o/ [8 Z0 W4 d$ j: E
- RewriteCond %{REQUEST_URI} !/maintenance.html$
4 M2 P7 V7 l' D' R* K6 U( Q
2 \! c/ Z$ L! v3 r) X9 R- RewriteCond %{REMOTE_ADDR} !^123.123.123.123
5 y8 N, u9 c% Y( } - / Z" @ L) G( n0 V- t
- RewriteRule $ /error.html [R=302,L]! D) b+ ~8 [' R* r+ k# z+ k
复制代码 1 e2 ~' ?- J Z
v1 P: I# D6 C4 V# o4 P: V( A( R+ J0 `" I: ?
3 n" g- k2 x: [3 V I; F% {" \& b0 }, F7 O0 i5 {0 E
/ E& B( h2 N' I$ f* m1.继续打开Rewrite功能。 2.REQUEST_URI,请求的URL值。这里指所有访问maintenance.html页面的请求。 3.REMOTE_ADDR,向服务器发送请求的IP地址。本例中此处应设为你自己的IP,这样就只有你能访问。 4.RewriteRule指令。本例中把这些请求都重定向到了error.html 。
- J4 q$ [5 _5 _& U' ?/ z在本例,我们总结几个常用的正则表达式和特殊符号。
0 }+ f, k) Q& q4 X/ h% @(.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。 ([a-zA-Z_]+) 匹配英文单词,允许用-和_连接。 ([0-9]+) 匹配多位数字,通常用于匹配ID。 ([0-9]) 只匹配一位的数字。 , e$ U' k0 b, \0 D, h
^ 表示正则的开始 $ 表示正则的结束 # ^8 }" D& z2 i; \3 O# x+ T; R' A
四、重定向RSS地址到Feedburner
* N3 }) J0 L& R: L除了可以更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。 [size=1em][size=1em][size=1em]- ' C& I, g; j: x
- RewriteEngine on
' A. F! G; J: _, n
0 r4 x3 t1 R( J- g" R6 e* z! Y! Y- RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
J! E$ A' k! X P* z
, R6 j6 n3 i, c k6 l4 P- RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
4 f+ X C. W1 I b3 Y - 9 T* ~& e; {. a5 T
- RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
4 P( O" z4 I2 S' Q7 P4 h
复制代码 / s" u( k3 Z7 Z% C" x- h( P
4 t! I& x7 D" ?; B5 G
- {3 ~* e5 b& |( {
* T1 u% V) k+ q Z! r+ H9 O7 R9 {% T
" f/ C, b& Y4 L5 b1 l) [" g0 V5 b& _
有了上面的总结,本例其实就很简单了吧。 唯一要注意的是这样操作要确保填写正确的HTTP_USER_AGENT。其实你不常换模板的话。。可能还是直接改模板更省事。 - T& ?3 m6 t; Q+ {+ | A8 e! d
在最后,推荐几个好东东: 在线.htaccess生成器:htaccessEditor http://www.htaccesseditor.com/sc.shtml mod_rewrite模块中文参考手册:http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html
. e. @! \. s4 {" F5 r! \* ]
: p/ p) P' f9 r, i |