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