|
.htaccess中的apache rewrite写法:; w% [5 d) ^7 S# `( J
3 L, I2 i! x( L+ M- H- |/ a- }9 f
[size=1em][size=1em]
! V) ]0 S/ y! i! w7 I5 m- RewriteEngine On
. h# `7 r1 B: \; I - ) |* C8 M! h/ P0 p6 Y% Y/ k
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$7 _ Z* r5 C( C+ J# R3 E n
- ! l% u% a1 m! W" M, z
- RewriteCond %{REQUEST_URI} !^/blog/
: c9 F1 J! P6 F$ `
% _, a+ s: E# M0 Y4 ~+ u" G+ e# ?- RewriteCond %{REQUEST_FILENAME} !-f2 l2 i: [0 s! M* J$ |
- " v% g) A$ d4 O
- RewriteCond %{REQUEST_FILENAME} !-d" @- h/ T. E W% ?" y1 H" Z w
3 d6 c0 l3 e- a& \# f# s- RewriteRule ^(.*)$ /blog/$1" K O6 L4 G7 ?4 j; F, U
- 9 B3 z9 \; e9 y" v b8 J
- # 没有输入文件名的默认到到首页
$ C: c9 O$ `/ u2 C' z. V
" ~, G3 ]9 I+ G. H& \. O5 |- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
3 |& H- }' U5 Q2 L, Y7 k$ | - / M" U9 l* ~6 @. E) L: z c4 U1 k
- RewriteRule ^(/)?$ blog/index.php [L]' K! ~. @% R' g0 Z. t
复制代码 - d7 w: }8 V7 o; V! Q. z+ ~
$ @5 o4 r+ O% U+ M8 B! n" m; f, Z. @
; k! u" O% v/ ^! A
- A; F& A5 H" j1 j
2 \) t Q6 q5 W+ S0 Z下面我开始解说一下上面的意思:3 S7 K5 D& q. T: \6 w' q
! H2 q0 s7 r* m6 a
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。6 L9 v, ^, X5 V+ F
- m' ^; p7 \5 }3 M! ]: G【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
2 |0 _, k: y0 _- i* m* n' p5 H" ?这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。% B, Q+ |7 {. K
2 R" h5 e. M$ ?* V8 |' N; L2 b【RewriteCond %{REQUEST_URI} !^/blog/】0 Q" g) m% a$ H: L4 W) s: o# \
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
6 @" |' ~% X" Q/ w2 ]
9 c; o7 R: A5 v( Q7 o6 F! |2 Q【RewriteCond %{REQUEST_FILENAME} !-f】1 L9 ^8 s7 O' Q; n0 Z# A( X+ E- q
【RewriteCond %{REQUEST_FILENAME} !-d】
4 V' y# A2 c% V) ~这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径. H, \. H3 ]& y
2 d" i* ` i' @* `) M, c9 U. n& E
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
3 p8 g0 M* v) Q1 T% [" W( n d+ F, T: P
& Z: Y. e4 h% s【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】% z/ [ a' e" M" o0 l) Y1 J$ j6 o4 p
【RewriteRule ^(/)?$ blog/index.php [L]】# } w: g: Z1 i0 [4 b3 B
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。9 M' R$ b8 d; M% X0 f0 Z- b
% i4 M9 N1 c7 C现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。) C9 A% j8 Q3 w8 V3 x5 N1 n
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
( v ^: |% P! _$ N, lRewiteBase /& \& ~/ M1 k9 |3 |- |
4 ?4 \- J% O$ C& q1 g, D还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
6 h# c p, {3 _) o& r" I$ x至此,完整的语句应该是:
3 _+ ^! s" L7 h) R- f |5 R2 M; k+ Y# C4 j
[size=1em][size=1em]- 8 M$ `7 z; m; f
- ####start####
4 t4 G4 u, d, O7 ~ - & O- F3 ]! K6 l- K& D& U- ~2 W' @
- RewriteEngine On
+ ]5 U4 P9 d( A7 d8 a - ) V& G$ H$ z$ Q( G; ]% _9 E9 B
- RewiteBase // `( G E' _6 G* T0 k
- 5 n9 J' H" V. h* _2 Y+ U
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]7 C5 P' f4 `. a0 n+ s, C1 y
. F8 j; Z; i' ~% e, f8 c+ y2 c- RewriteCond %{REQUEST_URI} !^/blog/3 _" C9 d. Z2 Q, Q
- * l8 R3 I. t' N+ Z; k3 d0 E" Q
- RewriteCond %{REQUEST_FILENAME} !-f6 x+ s2 k2 v F: M
@6 w" Y; X/ n2 [5 G7 l" d- RewriteCond %{REQUEST_FILENAME} !-d
! ~$ S8 g' U3 D8 A
8 B5 v) i' J- n2 P; }- RewriteRule ^(.*)$ blog/$1
. B) W2 f5 f% P5 r% u4 B- l8 O - . {" w- I8 J l t; v- K" `+ A
- # 没有输入文件名的默认到到首页
% g1 ^( M/ d2 m - 6 v3 r* ]/ x) M; L
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
- B6 v" X, ]( m7 m7 N - 2 `9 ^ Y& ?. ~
- RewriteRule ^(/)?$ blog/index.php [L]
. }4 r, g0 c+ H$ n( V' V - ; z! V; `1 U" j( Z8 W8 s
- ####end####
7 |" O+ ]% Z. X( ~6 v) X3 s- \: w
复制代码 ! _2 y- O- u/ D; W; h
& Q* H) U2 y9 r$ J0 z5 t5 W# y! C& g6 }# ~ l" o) w# @8 @
/ z) Q9 t7 R. f' {* @
0 k" Q- p% A+ f2 Y
/ N4 b# x# f3 Q% r如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
0 l6 k, R* @5 ~8 A) f( }. G
5 A8 R4 N$ R9 F) M% X防盗链的语句,同样需要添加RewiteBase /,如下:9 b- W$ y- ^) h+ I) }
4 W5 Q" D' G9 k9 i [size=1em][size=1em]
& b) T9 ^2 w4 P7 x5 z- RewriteEngine on0 Z1 d. ]; o3 \* y9 t# W* x! r# p
8 \- s1 ?, l! ~1 ^; C- RewiteBase /
9 n) T8 a" Q8 k) P# M6 ?: n' r ] - ' b7 Y4 H7 ^# V! I
- RewriteCond %{HTTP_REFERER} !^$ [NC]- o- }& E/ }4 j6 Z
- 6 X" F$ C8 l. o
- RewriteCond %{HTTP_REFERER} !xxx.info [NC]
3 y+ M( I& p* v. X8 d8 O - 7 y2 c5 Q, B5 E W
- RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]8 l3 j* x, ?$ o
复制代码
8 I4 V* I3 U. Q7 h; z4 l) X8 `- c2 j( H( x A) R& G
$ j" A9 ^ m8 Y$ y# d, J' N3 A
: f/ v8 @ A1 n" q$ ]* j9 ?: ~! G
# i; |1 e; O, P9 `
+ V4 B3 }# |0 |0 H2 L如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
) b) ^1 B0 i* v& A
8 a) \: e6 G8 H, }6 N: N下面附上简单的语法规则和flags:$ q, {4 b& a: @7 ^; e
【RewriteCond语法:】 e, t7 O# @; A- I' z9 i$ I
RewriteCond TestString CondPattern [flags]! @. J- i4 }. V8 ~
rewritecond的其他用法:
1 W g% b5 L& D7 ?/ P/ h‘-d’(目录)+ _9 d# g" l/ C2 c2 b' l2 X
将TestString视为一个路径名并测试它是否为一个存在的目录。9 R$ C; d2 N. E0 ?% r/ X$ a
‘-f’(常规文件)
9 j6 Z% F& A6 o) y1 G将TestString视为一个路径名并测试它是否为一个存在的常规文件。
/ N6 W9 n- n" K, H& S, S# R( ^‘-s’(非空的常规文件)% T* L) o4 R( b
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。8 P) s) X1 z: ]& p& m
‘-l’(符号连接)
& H% H1 U& b0 z. z$ i$ V9 x; Y将TestString视为一个路径名并测试它是否为一个存在的符号连接。# T7 Q: _: b& z) R, F
‘-x’(可执行)
0 L5 E. _$ `+ o+ J; F将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。+ J S. I3 F' \9 u" b
‘-F’(对子请求存在的文件)
2 ]) e$ o4 x$ g检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
; B$ r3 @1 r: J8 p% w‘-U’(对子请求存在的URL)4 i! {- z3 b# o
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
" c3 J) W/ g9 J5 u" Y X S$ l# _7 T4 [6 U) z q, c
【RewriteRule语法:】- T& v" _& n0 b, U
RewriteRule Pattern Substitution [flags]
! u7 H' r) Y: U% f |* y4 B! m+ ]. [8 ]2 ~$ U9 E
【flags】:0 L# N; Q# N3 C3 l
, F8 b6 J8 j! t( H
‘chain|C’(链接下一规则)) E, Z8 E* t* B) K/ c
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
1 K& _. ?1 `+ j0 x* M8 j: b t) w5 o! _& b+ ~
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
9 t2 I9 ~7 T. ^5 a! I在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。8 }' f4 i+ O, ^, V* H' ~' o- C8 y
. W8 ]' l& g% y7 Z9 @4 D, f
‘env|E=VAR:VAL’(设置环境变量)
1 q+ q; Y2 `0 x此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。! | F# U* G7 K2 F$ Q
% Z. T" L- Q" L; @' s6 u‘forbidden|F’(强制禁止URL)
* y4 z1 l* V U9 l- c强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
2 I% d! P9 h. e/ P v! I0 ~4 p4 @; l8 N+ _
‘gone|G’(强制废弃URL)
& S' }! Q8 r) W强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。8 ~& W0 y- v( ^. y+ U i
: Z+ T- g$ G4 O( O- Z" g
‘handler|H=Content-handler’(强制指定内容处理器)
( b( { X. \+ L( ]: P强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。9 a% }4 S; I2 i1 s& e
" T3 d& W4 [8 x# G# M, B# u
‘last|L’(结尾规则)# P S& f& F3 I; j
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。& u% x; o2 a2 o: C/ K
: _! s* X7 `! ~% c/ L% f% V4 [
‘next|N’(从头再来)7 [7 F# p/ b7 W* z2 _1 c7 o9 U$ \) j
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!1 G D# h$ {! i
" N5 d) `; o. N- l( X* P1 A, t _% o- h
‘nocase|NC’(忽略大小写), Y' |4 M: ]* i6 v9 z
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
& N( l( P5 {' K) O6 ~9 a/ A$ h9 }; F/ Z- ]" n- {
‘noescape|NE’(在输出中不对URI进行转义)
; \6 x$ j' y, o) G3 e0 r此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
5 W1 ^+ ]# T; D# y vRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
$ o" x0 @6 Q/ e可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。1 J9 o; w; g( F9 k8 B( h) c
3 H: G% S9 c' z! T
‘nosubreq|NS’(不对内部子请求进行处理)
; \ \6 l* b2 Q* {在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。# G( r& P6 N% X+ I$ ]
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。- X, s( a6 c& z) H3 r3 F
+ C* H5 T [; o6 E9 C$ B0 d- I# q. l0 P‘proxy|P’(强制为代理)
# M( i: A: X9 ^: d$ T此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。5 l" `# Y: |$ s. Q
注意:要使用这个功能,必须已经启用了mod_proxy模块。
( T* _" h g9 G; E1 F* \- {6 L, T- R" h
‘passthrough|PT’(移交给下一个处理器)2 j9 g& X9 A& ?
此标记强制重写引擎将内部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,可以这样:
9 l4 N6 N3 e. M3 r9 _: Y8 KRewriteRule ^/abc(.*) /def$1 [PT]
" B; |# ]/ G T- d; f( eAlias /def /ghi) \: R$ D; Q+ C2 Y" L3 x1 |+ m
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
5 R& i' U/ ^% y% D( O7 N; U% D+ S5 B注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
* D$ O2 j9 I! K/ @+ j* I8 h2 q' K& v9 Z+ @ E+ B
‘qsappend|QSA’(追加查询字符串)% m" L2 ~: a) {+ @
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
" ~ l) e# P1 [. R% ]
' k [0 s2 J, _4 s+ u9 e‘redirect|R [=code]‘(强制重定向)( o' y/ C, J! U* S0 f$ ~7 N6 I
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
# T8 S- L# j" g2 g注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。3 K6 a5 T5 ?$ ^2 P: x O/ _% X
' q; F5 W( z% a" R; U: b’skip|S=num’(跳过后继规则)
4 t7 w" R' f7 [# A此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
2 T2 y7 s6 A- p2 u8 @+ K
6 y# h$ i& A) V‘type|T=MIME-type’(强制MIME类型)
% g5 S# m. @. Q) P& I强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
! f; g! \. P5 E. IRewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]; M! W: ~5 {' P: C6 f1 J
4 h8 \6 {& I+ G4 c7 k如果熟练掌握rewrite规则的编写,能够加强对网站URL的控制,对用户体验、SEO都十分有利。
; Z) b! Z N$ ]% [/ j) r一、防盗链功能
- M' y! m4 f8 f7 W$ Y& _ [size=1em][size=1em]
6 {, B: E+ N! f/ t" o& a- RewriteEngine On
% P" \' W& |; P- {
6 R) g A& W- Q# g* A7 S6 x. y- RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
" o$ u. E, K1 e9 r7 r; @- N% U( h - # f3 Q: L: \* x% r9 o
- RewriteCond %{HTTP_REFERER} !^$
2 ~0 P& y, c8 m6 M# J' |
# g6 Q& H9 L) A) Z% x; e4 U% b) Z) d- RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
" p/ |- X; D" @7 Y3 |2 |
复制代码 3 R6 {/ i* ^1 @& k
4 R& `2 s% ?9 _% \- S
/ q) s$ V7 S. O9 E
, L- |! Y+ c Q3 `, C
4 n# R8 S9 c o( t, h3 v
( o4 O7 N/ s" {6 x" J( Q: |逐行讲解一下:
: F, r+ G! ^# S3 H, }1.打开Rewrite功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。 2.RewriteCond指令,定义生效条件,用于寻找匹配条件的地址。后面内容用正则表达式匹配。代表含义是发送的请求不由mysite.com而来,那就是盗链啦。末尾的[NC]代表忽略大小写。 3.发送请求的主机前缀不为空。 4.RewriteRule指令,定义重写规则,把匹配的地址按此规则重写。本例中把这些后缀为这些图片格式的,都替换到某一个图片下。[L]表示这是最后一段规则。
; Y! L+ U# ^( `! ]9 k7 K只这四行就实现了防盗链是不是很神奇,编写起来是不是又觉得复杂。 这里总结了几个常用参数(不是全部):
: W7 ], M! E# D/ x' u% Y- ARewriteCond下: [NC] 不分字母大小写 [OR] 用于连接下一条规则 , A7 u: T8 q' Q* ` R* l( A
RewriteRule下: [R] 强制重定向,[R=code] code默认为302 [F] 禁用URL,返回HTTP 403 错误 [L] 这是最后一条规则,之后内容无用 6 F8 `0 I! a$ k' @6 R, ^
还有一篇关于正则表达式的教程(很详细): http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm: ~1 I2 C& A: W6 d9 u
二、网址规范化 [size=1em][size=1em][size=1em]- ) ^2 c, c& i1 S l3 p" }
- Options +FollowSymLinks% p7 c3 Y1 {1 }1 y4 m2 s
4 \* ~ f* I5 m- J/ ?' Z- rewriteEngine on
% o: ?1 `7 t! p1 ?! v0 D% n0 Q6 Z
4 G0 [2 }1 i7 }; @# e- rewriteCond %{http_host} ^yourdomain.com [NC]; U' k/ g9 N) B# d# ~
/ B! R3 N/ w o0 z$ g0 X- rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
7 k; Z& A2 s( J$ s) @2 R6 |
复制代码
' ]& A8 w) |: L3 @' S N6 E4 \
0 F' T% f* S& T6 l' D6 h- S# }) t
& P y0 O1 R V
/ g. ^8 h5 G( o `+ c" H* x" n& c$ P* `5 g- z: y) x
8 K+ X! N8 R9 x5 O
这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了? 需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。 3 T! ~% s0 {6 Z- f4 I& y3 V, ]* [5 W
再来看一个好玩的重定向,把google蜘蛛指向某个网站 [size=1em][size=1em][size=1em]- ' h) l$ {- `! Q% ?% r+ G
- RewriteEngine On
4 r% ?) J5 ?5 m/ E* C. V - 3 Q3 C* J4 o* x2 u/ _( y3 y" F$ S
- RewriteBase /
: `+ X# D0 A$ Q
) y) z: r& H! x7 t7 l+ V( o- RewriteCond %{HTTP_USER_AGENT} (Googlebot)
9 Z: ^( z! d/ H
5 b4 d$ ~% B0 S9 Q$ ^" M7 l- RewriteRule ^ http://abc.com/ [R=301,L]9 Z5 K' ?9 s, t/ S3 m# T7 b
复制代码 G3 T( F& g) l
/ y! F: B5 E/ v! A% q B3 z9 [2 A
& W ?; ^6 z* Y1 d: L" |( z' o3 z9 e' b% |2 |' M+ E" Q
+ \8 L( D- e2 L6 U" L; [3 J7 j# {* O! J6 q7 |# U9 O
1.打开Rewrite功能。 2.RewriteBase指令,设置目录级重写的基准URL。可以理解成把该目录(这个.htaccess所在目录)假定为基准的URL前缀。本例中这样的写法无用。 3.RewriteCond指令。匹配所有USER_AGENT为Googlebot的发送请求。 4.RewriteRule指令。本例中把这些请求都重定向到了abc.com。
# t% U" m4 [9 k* H0 j) [$ t* K在本例中,这个配置应该是黑客所为,把google蜘蛛指向某个网站,等于伪造PR。
/ G* H0 u' @& @三、临时错误页面
) X' B V" o( ^当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。 这时我们做一个302转跳就好。 [size=1em][size=1em][size=1em]
/ r$ d- F Y& _# r# {0 t( Q- RewriteEngine on
. Z" D! z* ?& X3 ~5 M9 S. N' ^ - 7 u! D6 D) k% O' |1 `' b
- RewriteCond %{REQUEST_URI} !/maintenance.html$; X e+ P* I- T0 m5 ]$ F5 ^1 y
; x& U# E; }5 S* d- t* L# e7 p- RewriteCond %{REMOTE_ADDR} !^123.123.123.1234 g3 }& Y! X/ }/ F1 h
e/ l+ g' i2 m2 K! v" k) D9 N/ X- RewriteRule $ /error.html [R=302,L]$ z& r: N$ y* E6 i; @7 O
复制代码
1 m9 V$ H/ @- ~3 Q$ n/ o8 A# O! Z+ g% i4 l1 O+ H
) |- B. h3 V6 |* a0 h9 }
2 y9 f, ^5 @* ?$ O- B* ~5 F9 c, J" P
' S" T. m! k' g
% N0 ?" W" L/ E0 K- M' P1.继续打开Rewrite功能。 2.REQUEST_URI,请求的URL值。这里指所有访问maintenance.html页面的请求。 3.REMOTE_ADDR,向服务器发送请求的IP地址。本例中此处应设为你自己的IP,这样就只有你能访问。 4.RewriteRule指令。本例中把这些请求都重定向到了error.html 。
8 V7 I1 T1 K/ H" j! W/ U# U" @在本例,我们总结几个常用的正则表达式和特殊符号。 3 u0 ^9 N% X, e$ u8 z& ~# D
(.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。 ([a-zA-Z_]+) 匹配英文单词,允许用-和_连接。 ([0-9]+) 匹配多位数字,通常用于匹配ID。 ([0-9]) 只匹配一位的数字。 7 d& a7 H6 q( ]9 N( i+ @, c
^ 表示正则的开始 $ 表示正则的结束
, W5 F: p) {1 a& T o四、重定向RSS地址到Feedburner
0 ?1 S+ l: f8 ^' `# i& v9 T除了可以更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。 [size=1em][size=1em][size=1em]- 2 [ J0 {9 X2 ] ?' ?
- RewriteEngine on# {& G& ]1 h9 k' B z" ~
- 4 n( Z. I+ v/ r. n% \
- RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]& C4 C0 D4 g( S& K9 K, W
8 q |% j4 f2 O& m- RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]9 z7 c9 j0 A/ ?, G b) O; C
- ' ? |7 b" }! J) d
- RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
) \# V/ C) q0 ?0 K O, D" g! u" V' n
复制代码 : [, a9 A- b: v. @8 W. u
9 U3 D4 x2 x* M, |! [# ?/ ]0 e+ R/ v7 k
: N" [: Z! d* E: a+ s
. S* r0 Y; u' f. v" M$ Y( ^; N. ^
# P/ }: M1 A" p t- F+ Z* j; E9 S5 @- r
有了上面的总结,本例其实就很简单了吧。 唯一要注意的是这样操作要确保填写正确的HTTP_USER_AGENT。其实你不常换模板的话。。可能还是直接改模板更省事。
_3 D$ {( } M在最后,推荐几个好东东: 在线.htaccess生成器:htaccessEditor http://www.htaccesseditor.com/sc.shtml mod_rewrite模块中文参考手册:http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html ; A4 ?. z2 a& u/ |0 F
9 m; s% d1 ~/ R, n; E0 X! ^* a& V |