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