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