|
.htaccess中的apache rewrite写法:9 n2 Q {- z4 f
1 I: ~; A0 Y0 p3 a9 \" @5 w7 i% w
[size=1em][size=1em]
6 n6 R8 J# O; d0 F- RewriteEngine On6 H4 S! |4 l8 c
- 3 q# {+ _. d1 A9 d
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$4 \( j/ v# G1 X9 M6 B- m! ^
- ( Y6 U* R# D6 o. @* Z8 M: I4 f, Z5 A1 D
- RewriteCond %{REQUEST_URI} !^/blog/
/ k$ o: N6 N$ u) g
" f& m; f' q" q4 X, f- z8 b- RewriteCond %{REQUEST_FILENAME} !-f
* ~6 m) x& T7 T3 i2 Y* m
, B' f" N: n; b% c& L; i3 f8 P- RewriteCond %{REQUEST_FILENAME} !-d
/ d5 c d+ i5 ? - % |7 ^! S0 C# i8 c
- RewriteRule ^(.*)$ /blog/$13 r; e$ ]4 T6 W: Q; i/ |% I
/ |5 T. t) a( o* i- # 没有输入文件名的默认到到首页
- @1 G4 @/ ^( Y. _! p+ P - 4 F8 o. {2 c/ u* W
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$& E; n+ b! q6 j# _" B% w
- 1 P7 R R) o9 `0 c( F" O
- RewriteRule ^(/)?$ blog/index.php [L]( }+ ]& G! K2 @0 N& z
复制代码
9 N7 t9 O7 p0 |9 p; ]* z! P7 z# z( l& w6 H
2 B1 v/ }- r5 o w# P& N3 e
/ m7 U4 A4 H/ T7 n" R/ g' p: m7 g6 y x
! x7 y+ k" p" r3 u1 W下面我开始解说一下上面的意思:
% y+ m A3 k, u( y: d4 Z* B% g! r4 z z, K5 k
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
* J0 |# s1 e# X% J2 z' E2 \1 z" U# B
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
3 j1 w/ K; w) V0 l* C" T这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
7 H N! v# N% [* M* {& V, H
6 t7 ]& T0 f% U. B, d# J6 W【RewriteCond %{REQUEST_URI} !^/blog/】
9 E/ J) C k! z: \3 t' ~也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$8 F+ {0 ~- e: _: o, N
/ @/ n, x' O: z, [, r5 n
【RewriteCond %{REQUEST_FILENAME} !-f】
" k" n! k+ h5 `8 m1 j【RewriteCond %{REQUEST_FILENAME} !-d】4 }5 X( ~. c- e2 `; f; n
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径3 ]4 x y* t4 O) W& G, H" |! t
x9 _) B: ?. r& G【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。3 C4 F& @9 j* ]1 L( i! z
$ ~6 F4 n. A: ^& o7 r, U4 U" @
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】( d, [1 S1 M( N8 N/ l1 X
【RewriteRule ^(/)?$ blog/index.php [L]】# y4 i) e$ A/ L; ~ b& l$ I6 n9 ~1 A, \6 T
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。! u& D/ `; _' F$ G3 g
7 k1 h$ W1 a3 s# ~
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。0 q. @# e b& }& }8 @
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
$ V3 w6 R! c8 I! ?6 b( oRewiteBase /
8 B$ H0 L g: c# w. l9 Q- a: t; Q! X. z- @
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。7 t- q+ b% N/ y6 G% m8 H8 ^
至此,完整的语句应该是:
% I) A2 c0 P9 v" @7 o( k8 t
) M" B# F% W7 j6 P6 `9 D [size=1em][size=1em]- % r/ O) r6 k" ~. ^; r8 V
- ####start####) y6 |5 O9 P: I9 z- A: |* S5 i' S
- 8 f# X7 a5 x: W6 l$ b
- RewriteEngine On
, Z1 [# r; f+ M# ?: q - * Q8 U \8 A- u
- RewiteBase /- ]& ^. M2 `3 |' `: G
- + O8 l a7 m$ h6 F
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
" T5 B1 U) _' q, h1 S- f3 s
, `$ K/ t( y! B. h7 `* d; s- RewriteCond %{REQUEST_URI} !^/blog/+ \% Y9 u( ~% P( x
+ D" J+ ?4 C+ A- RewriteCond %{REQUEST_FILENAME} !-f
* H4 c8 e; s3 O& {/ ?+ K8 h
, V E6 @9 U+ h: p2 H7 _6 d' R- RewriteCond %{REQUEST_FILENAME} !-d
0 H, C2 ]0 L7 p; L1 l - " d- X. a1 s' T" I! X
- RewriteRule ^(.*)$ blog/$1
3 d# ]9 {% Y% q2 _
% v6 P( ? I* l- J6 P3 Y- # 没有输入文件名的默认到到首页, k8 x$ F& n) n) |" e0 s9 e6 \
- - c2 A, |4 x* p' w' [4 U
- RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]9 P& v) G! Q- g. I* r0 V
- . \+ [3 j, C! r! n' T, L q2 D
- RewriteRule ^(/)?$ blog/index.php [L]9 e; M }$ g" g4 _+ s
' N) t3 i' n7 ]6 t! i4 J! t- ~- ####end####" r* b" W. x+ ~! U' S
复制代码 ) Q0 S+ p2 c( q) r7 K
) @; i/ _8 C1 U+ Z% O0 X
+ j' {% H1 ?0 U
* J! N' {8 p% q* x7 g8 A6 f
+ f8 W% l g5 ]3 M; y5 ?: i4 K6 T, h+ U$ \
如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
# g8 w- H y( B7 l! M, x9 O+ ?; I4 j* T$ R \; _
防盗链的语句,同样需要添加RewiteBase /,如下:, U& q1 r$ n0 k( q# h
$ P6 ^. ]2 A0 p- ~( k8 j8 o. A
[size=1em][size=1em]
( `6 N6 K' ^2 ]- RewriteEngine on- F$ R' c% J3 r: g. E6 E
- & c+ a* A& Z+ S# ], Y& M9 ?
- RewiteBase /
, ^3 w G" @$ ?0 n- z - 0 L2 G4 T; B4 e: D; y- I+ m% K" R6 o
- RewriteCond %{HTTP_REFERER} !^$ [NC]
( h' d" ?& H, V8 ^* C4 R2 P( V0 @
4 j' h) D3 r4 g9 c3 Q- A- RewriteCond %{HTTP_REFERER} !xxx.info [NC]
; d0 B2 S) b: b4 i& J7 a% H - % b; Z! j$ R/ Z+ l# |
- RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]! h& J |# S9 O% [, F# [
复制代码
3 a3 s2 x; \( f! X: @' c3 y- T" ]) }) x' X+ H
8 q# R8 ^, q2 z% k4 c0 ^
" W# r7 D: \& J5 j# d3 Z3 N1 `* ?
7 v+ W! l J7 Q; _. y' J* U; P% z l; m* ?6 a4 d3 F% t. S4 w+ S
如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。& m) h) j: E- S! [0 u
6 k; C: \6 h R/ n& e下面附上简单的语法规则和flags:
7 M. A% |5 ^0 A, m% n% r【RewriteCond语法:】
" @4 D% ^: }3 } Y" ZRewriteCond TestString CondPattern [flags]! q* }. w. E5 p% s* J% V; m
rewritecond的其他用法:
* P9 i3 @6 A3 @' Q/ z5 J7 Q‘-d’(目录)
$ K- ?" a" O; j0 ]3 J将TestString视为一个路径名并测试它是否为一个存在的目录。) C1 C8 \% C- D X9 J$ t' i
‘-f’(常规文件)* l3 u$ s6 C8 N' E
将TestString视为一个路径名并测试它是否为一个存在的常规文件。" u. Z2 y8 ^' S% b( `
‘-s’(非空的常规文件)
$ [) g5 q# P w将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。/ H C" b; O- a0 U. `) L; M# i: i. C0 W
‘-l’(符号连接)
3 t8 b# d1 j- k5 }将TestString视为一个路径名并测试它是否为一个存在的符号连接。
' ` R$ K6 V; I& O% Y‘-x’(可执行)
: R' H0 x" F9 |5 W" X( [将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
/ J' X5 j* Z. _- o4 |3 A" L s‘-F’(对子请求存在的文件)7 ?1 V' Y, |* \( w- N
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
0 G9 [7 ~" W* h* l' i6 x‘-U’(对子请求存在的URL)
$ `1 H) b+ k5 f# w3 H2 A& P检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!2 k. l3 O; \+ T6 r
# ]8 ^9 g- a2 b- V" E" J# @【RewriteRule语法:】
* h6 A: T( a7 Z% V1 tRewriteRule Pattern Substitution [flags]) M& A9 C3 g3 g
# U; i% l' d3 y D4 k3 X
【flags】:
8 T+ R/ D5 l; S' e
7 u) g( Z. a8 H‘chain|C’(链接下一规则)
2 m" O* y+ D. Y/ n m此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
, Z9 p% @2 r% M; W
$ ?- q5 Z& p8 l* |" i7 n D' F* U7 b% b* q‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
X. D% u$ f2 J9 Z5 Q2 J* _3 j在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
! N! F4 i9 Q3 z4 U
9 ~" ^; ^5 M. X6 ~& ?4 d m" G& r) J‘env|E=VAR:VAL’(设置环境变量)
7 B+ e6 B6 Y+ y( L$ ]5 Y; N' C此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
, G% Z' n2 K, g, }' F4 w7 `4 U
1 q2 r8 h& z+ A6 p‘forbidden|F’(强制禁止URL)6 ?' z# @- S5 ?. h% k
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。& S, N' W+ z! r7 {/ Z
2 f r2 d; }) y0 Y9 T$ p‘gone|G’(强制废弃URL)* u$ B) z& k" _) t
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。( L1 s3 u, M# o% K
7 t. k# b( `& _% a2 F$ ?‘handler|H=Content-handler’(强制指定内容处理器)
1 H7 f0 M! C' X# a1 O s" a0 u! _强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。 y) Z9 \" z( J9 C
4 j9 S# S# V" q$ V: k: Y$ U! S: k3 N
‘last|L’(结尾规则)( l/ O8 i1 v7 C0 F/ E, v1 i, ~- k; W
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。- M( U3 r/ x6 v! m% S# h- k4 G6 |
2 O; f S* q5 v) P/ A$ O# _, t‘next|N’(从头再来)9 ?. ^9 e4 p4 W0 F0 v- c; n
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!9 ^. R2 S- k7 G! Y: g8 A
: K( J# R1 u! R0 w+ ?* r‘nocase|NC’(忽略大小写)
) _& |, [! C' @5 w7 q9 Q. f# K6 A它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。( I( C6 |( B( P; ^; P% ~$ Z7 `
6 h. F( q( m0 Q5 b* }( x‘noescape|NE’(在输出中不对URI进行转义)! W) T. }- b9 ]
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:3 T# {4 O, n+ {, n1 o6 h1 K
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
' {, ?6 v6 G- E3 T+ i可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
. p# Y- R' X4 y0 f8 U$ r
: U6 H* @: E- w; H‘nosubreq|NS’(不对内部子请求进行处理)
$ I% T2 d' l- Z3 C8 M% C在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
( ]: m% r. n% W使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。; q% E0 x, k" g# I+ {1 w y. B9 I% o
7 c/ _0 E3 v! S( U0 I2 J
‘proxy|P’(强制为代理): ?3 d2 I/ z0 l8 E
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。) i7 s9 z: b) y$ h* E
注意:要使用这个功能,必须已经启用了mod_proxy模块。
7 ^$ n) Z/ H" d# ]8 B) s$ u" ?3 y7 @% L' T0 J
‘passthrough|PT’(移交给下一个处理器)0 B# \6 ]! z- C4 ^
此标记强制重写引擎将内部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,可以这样:
6 |& w; C( u6 }6 \/ jRewriteRule ^/abc(.*) /def$1 [PT]
. Y% u5 B& r- \6 i d) EAlias /def /ghi
. I7 }+ H! [; P0 J如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。 j$ A; t9 \# @) c- G
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
& P8 @; P; B7 c% u6 d8 p/ v& d) L/ }( D$ M5 B' o8 K% O9 W
‘qsappend|QSA’(追加查询字符串) h- z. C. `6 c6 e+ B; a
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。 S; [- ^9 T- Q3 c7 m" p
9 Y R; y% H, x4 Q; u
‘redirect|R [=code]‘(强制重定向)2 n# V5 L1 Y i0 m6 W0 l
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
+ ]% f' j& w% B- H% C5 p, M/ `+ J注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
' u2 k' j: I# F6 F' T5 x# i% Y" P, f8 L4 C
’skip|S=num’(跳过后继规则)4 Z" i3 L& M6 U( L- s
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
5 q7 T8 y1 G' @, ~6 D. E1 c5 [" ], D$ x: n) U9 g4 }& F
‘type|T=MIME-type’(强制MIME类型)
g) { u9 r- _; w N强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:. R! _4 Q' P/ x/ b. b
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
* V- N& Y6 ?7 ?# O # W& P7 \: s, }8 r9 b
如果熟练掌握rewrite规则的编写,能够加强对网站URL的控制,对用户体验、SEO都十分有利。
' j( X: c) |$ b1 Z) j一、防盗链功能$ W2 T- F3 q1 m4 [# M; o; `
[size=1em][size=1em]- 4 P& a5 ]: e& z7 B
- RewriteEngine On
, R: m! D: P; u- I+ [ - ! V% k n% X5 B+ A) ^
- RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
! r& p6 Q p/ E - $ c6 l# w4 h& O
- RewriteCond %{HTTP_REFERER} !^$; u% C0 ~4 o8 x) y! Z/ f
8 [/ a& d* s, t& D5 J. j; j- RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
% @, q" u5 N2 q3 w" ]7 X5 }
复制代码 : d+ P$ c( X$ o2 f$ l4 G
1 ?; q4 w" t1 H; N1 B, F
* F! z) k0 z+ H8 z: W5 k
- S& L. j7 s& x D5 z' ^# t0 o7 J, S- n
' y% h) J# ~4 c' p. i; p逐行讲解一下:
# r) s' p! T" Y/ T) l7 E9 m8 j! N1.打开Rewrite功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。 2.RewriteCond指令,定义生效条件,用于寻找匹配条件的地址。后面内容用正则表达式匹配。代表含义是发送的请求不由mysite.com而来,那就是盗链啦。末尾的[NC]代表忽略大小写。 3.发送请求的主机前缀不为空。 4.RewriteRule指令,定义重写规则,把匹配的地址按此规则重写。本例中把这些后缀为这些图片格式的,都替换到某一个图片下。[L]表示这是最后一段规则。 - ]8 s+ {3 u0 v0 c- i: A
只这四行就实现了防盗链是不是很神奇,编写起来是不是又觉得复杂。 这里总结了几个常用参数(不是全部):
1 O; i8 N3 f4 }, Y {9 s, z6 h/ C; v- ERewriteCond下: [NC] 不分字母大小写 [OR] 用于连接下一条规则 * x" ^% u9 h8 H4 q
RewriteRule下: [R] 强制重定向,[R=code] code默认为302 [F] 禁用URL,返回HTTP 403 错误 [L] 这是最后一条规则,之后内容无用
/ [* w, \: F2 w9 y: C还有一篇关于正则表达式的教程(很详细): http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm3 _3 U* L" }# _2 \9 L% h
二、网址规范化 [size=1em][size=1em][size=1em]
) B6 t- G; a% Q- Options +FollowSymLinks
' B% L; C4 E$ ~+ @
$ o3 x& A/ s0 t3 V) L( x- rewriteEngine on, j% C: H; t' ?$ x- l
- 9 m% l6 m) N! S1 H/ n& i, T5 \! L
- rewriteCond %{http_host} ^yourdomain.com [NC]( ]9 c3 \/ v+ O
- . G4 J* n! W3 N. C
- rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
5 C* T) R5 [% u3 i
复制代码 & h \) \! p n! C
' z9 K- G# d a: m" X
- V4 Q5 z% G' z' X) g; z# G$ o4 E+ O
# G, l9 t0 @' x
. P- `+ z3 C/ i( [0 _2 n. @9 T这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了? 需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。 ; d7 |7 O; i1 O) y, ^
再来看一个好玩的重定向,把google蜘蛛指向某个网站 [size=1em][size=1em][size=1em]- $ ^+ ]. y1 _/ ]9 ?
- RewriteEngine On
6 B1 i8 t9 w+ z: b" i
7 E* o1 M7 d4 G' }; J. i- RewriteBase /
! B$ B3 A3 g+ g, G8 c. z- M* n: B - 7 S3 m! s2 u' l8 T, y+ r0 {. U
- RewriteCond %{HTTP_USER_AGENT} (Googlebot)
! c& ~/ t" O" `& J1 M% x: @. P
- s: z' \: l; S7 Y3 u- RewriteRule ^ http://abc.com/ [R=301,L]1 D: f+ s5 B3 h, k, j
复制代码 / f I, G. M" p" @# l: l; U
9 v2 |! i: w& a2 k' w0 U5 S4 u z, L8 _# [( S/ `" l$ S
8 b7 [+ e) a/ j1 n
* {7 t* y) w) W/ F1 F8 c
9 S; o- Q3 C7 @3 F! v1.打开Rewrite功能。 2.RewriteBase指令,设置目录级重写的基准URL。可以理解成把该目录(这个.htaccess所在目录)假定为基准的URL前缀。本例中这样的写法无用。 3.RewriteCond指令。匹配所有USER_AGENT为Googlebot的发送请求。 4.RewriteRule指令。本例中把这些请求都重定向到了abc.com。
" s) @; ^7 }: f: a$ C$ F在本例中,这个配置应该是黑客所为,把google蜘蛛指向某个网站,等于伪造PR。 * V0 D( P/ t3 V' E
三、临时错误页面 4 r: s c1 f1 ~0 n
当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。 这时我们做一个302转跳就好。 [size=1em][size=1em][size=1em]
; M, K, n) `1 ?, }- RewriteEngine on
6 W$ ]. V# S5 i& j6 S9 O - " y! H. c, R3 ]) x" S: W, h% r
- RewriteCond %{REQUEST_URI} !/maintenance.html$% n7 R; d' D q- W' e( h; T
- ; \9 g. Z9 w- c& h, o1 }2 ~* |' q
- RewriteCond %{REMOTE_ADDR} !^123.123.123.123
7 Z' N: d* b6 a0 j. m
; g" B2 o& \" ^$ \) \- _0 W- RewriteRule $ /error.html [R=302,L]! A; x9 k/ Z- u, S3 ^
复制代码 & v. I4 w( t+ H$ [! J
{2 Q- X3 i- {. D
+ D5 J7 X5 R+ E" ^/ w/ S( K/ j
/ {, U0 |' `+ A" r+ M) ?( K
2 i0 J: @, C) w2 \
& k( R, [8 S9 F+ e1 c M9 X5 Z! G
1.继续打开Rewrite功能。 2.REQUEST_URI,请求的URL值。这里指所有访问maintenance.html页面的请求。 3.REMOTE_ADDR,向服务器发送请求的IP地址。本例中此处应设为你自己的IP,这样就只有你能访问。 4.RewriteRule指令。本例中把这些请求都重定向到了error.html 。
* T3 L0 n9 |5 f8 U, A( F0 F在本例,我们总结几个常用的正则表达式和特殊符号。
2 S" P( b% ~( D5 z' j(.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。 ([a-zA-Z_]+) 匹配英文单词,允许用-和_连接。 ([0-9]+) 匹配多位数字,通常用于匹配ID。 ([0-9]) 只匹配一位的数字。
4 U2 A+ }! U7 V6 q: e0 m^ 表示正则的开始 $ 表示正则的结束
4 `) [+ g l+ j5 t. g3 {四、重定向RSS地址到Feedburner 1 g2 t( c7 u" n) M
除了可以更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。 [size=1em][size=1em][size=1em]- ( I ?( u+ k. B! _, N8 Q; h
- RewriteEngine on
0 S0 {# d9 c& K: o: `) s4 Q9 g
5 ]& }6 H c2 N- z# {' Y- RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
v$ q y0 \ q9 R# N% F. T6 Q
9 b3 b7 S. H' k: A9 W% }- RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
8 f$ l& |5 N$ a* H" m; { - - }2 \8 p8 w; N8 y" ?8 L$ ?
- RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]. k2 I( O- R8 }( l$ j$ i
复制代码 % o$ {2 }8 y- _8 G* {) r5 ?
7 ~: r/ u( k, J' S M
) k) m) C1 n3 B
$ F/ H. L$ R1 \% j
2 c3 `; U1 V5 ?% ?3 {# U2 h
* o& N" L( Y7 I* b' _有了上面的总结,本例其实就很简单了吧。 唯一要注意的是这样操作要确保填写正确的HTTP_USER_AGENT。其实你不常换模板的话。。可能还是直接改模板更省事。 " t9 y, B6 r; Z+ c# M1 J$ X' O, c
在最后,推荐几个好东东: 在线.htaccess生成器:htaccessEditor http://www.htaccesseditor.com/sc.shtml mod_rewrite模块中文参考手册:http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html
# U. r- [! B; D$ ^7 ]) |1 @
3 k1 _% ~# J2 b6 d) a! U1 ]+ [ |