您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12362|回复: 0
打印 上一主题 下一主题

[html5] .htaccess中的apache rewrite规则写法详解

[复制链接]
跳转到指定楼层
楼主
发表于 2019-1-4 14:36:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

.htaccess中的apache rewrite写法:* G9 Y( X- V9 q5 C+ [# M. W

7 f8 Z3 S5 g0 R+ V0 l. V0 |$ r

[size=1em][size=1em]
  1. + Z; {$ y: h  }% ~4 Y
  2. RewriteEngine On2 Y/ b$ V( l) {% {, L# w( E

  3. $ w, S. {7 S. f6 ]. S! [2 b) n
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$1 S* ?  V, T: w

  5. 6 ]9 V. W: v( b/ m8 w5 F
  6. RewriteCond %{REQUEST_URI} !^/blog/
    2 T- ~0 r$ f  b/ m2 @2 X

  7. / g' }8 |" s4 {5 Q: ^6 s7 o
  8. RewriteCond %{REQUEST_FILENAME} !-f
    0 G0 J4 j* m) `" |  O+ r5 ~

  9. - p: ]) i! c' m' R/ I
  10. RewriteCond %{REQUEST_FILENAME} !-d0 w  {' ~' z" u% O6 k
  11. 3 S" R! `. ]5 G/ h0 G! y
  12. RewriteRule ^(.*)$ /blog/$1/ Y; K+ D0 y- ]$ q8 w7 _5 u
  13. : Z" B3 V  O" A" M+ a* j) `
  14. # 没有输入文件名的默认到到首页( n! C2 D+ {, D+ V

  15. + ?& t/ C$ C2 m& Y  Z% f4 q, |( A
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$6 [7 \9 U% L) m, E% Y% W% H

  17. 4 F  v0 e9 u4 q( w2 s' C- C  c
  18. RewriteRule ^(/)?$ blog/index.php [L]
    1 {) L/ b4 b, b  w" }3 \2 Z
复制代码
7 n# h! O8 I1 P# j7 ^8 I
1 ?& u1 ^& b# `

! _6 w" c6 W' _/ c. w- I8 {2 D  w4 Y9 w6 [2 f

, G6 K* {% l. o: x6 \# k

! ^: Q( x) A. G# P4 y/ V5 H

下面我开始解说一下上面的意思:
0 _+ @8 V' x. e- G! Z1 ^& ^; B
( e3 H4 X% J9 O+ e6 Q7 {【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
7 ?6 S# e7 e) b/ \4 v5 m0 n# c! g+ C% W1 l. k6 P1 r6 _' ]+ w, U
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】2 w* V$ N! A" q4 ~5 g! \
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。% k0 J0 m6 p% @8 h5 I; d
. _3 e' O5 s* k/ v" _
【RewriteCond %{REQUEST_URI} !^/blog/】
. F. i$ G9 R" E) E6 ]5 V/ q也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$; b( Q0 p5 C, e+ x9 r" m; Y! e

# G5 P; x- N6 @1 P6 m2 I1 w) |7 _【RewriteCond %{REQUEST_FILENAME} !-f】8 z4 g7 ^4 }" j
【RewriteCond %{REQUEST_FILENAME} !-d】
! }, U& v9 i) s! @3 e4 k/ _2 e6 |: V这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径) N. P" S# ^' t  f' s

3 K1 [: X; k$ o) ]【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。$ L7 ]* h1 x; G' O; j& Z0 Q' N

& ~0 r% m2 A5 \8 ?( O9 i【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】4 N# F+ q. U! r
【RewriteRule ^(/)?$ blog/index.php [L]】
- t# w  ^" ^, C这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。+ Q4 e6 j4 l2 a: M+ m9 `% E# x% \
" _) H# ]/ D7 g$ L5 U
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
: U+ ~& A- [& X  f/ f. y% s& ~4 g2 y答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:% L2 F# l+ e2 T' \* N7 l7 S% L
RewiteBase /" K8 S: }/ M; t) W  u8 Q8 Z3 [! Z

& r. O. e0 P: E6 l) B还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
$ S9 \  k2 h$ t% ~, A7 d至此,完整的语句应该是:4 f+ r; e- E: e3 ?9 f6 j
3 D& z# y; G* T1 p

[size=1em][size=1em]
  1. 2 d! Q% c# a% H7 ^2 i
  2. ####start####
    5 E* R3 l/ w+ j. i" R: Y

  3. % R5 I0 B1 {* \$ T* h: \
  4. RewriteEngine On5 J9 I, s3 K' _6 }0 m7 i7 z/ V
  5. " X+ _, i6 O/ t& O& T
  6. RewiteBase /; T6 ?# R0 F' N  Y
  7. 7 x/ X% C  V1 b3 V* r8 I
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]) B0 m4 I' J. N0 z' [

  9. 9 F8 R4 z. d/ e& D2 G
  10. RewriteCond %{REQUEST_URI} !^/blog/% M  m* j. D3 M, K) n% _
  11. % X. I8 O8 ^* G' O3 O# E
  12. RewriteCond %{REQUEST_FILENAME} !-f3 l' A4 K6 y( o: z4 p( K
  13. / _; h9 w" J. G6 m$ f) i
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ( p3 O( f' i: T+ L1 P$ O
  15. + |( p( u( n" M- Y
  16. RewriteRule ^(.*)$ blog/$1+ {: b: I3 X+ R
  17. + h+ j% _: z# D8 [5 }  n  B+ o
  18. # 没有输入文件名的默认到到首页- c+ v) ]" X+ V) m& M# G, P

  19. - ?! z1 A  o( h0 N% ^' u# K8 e1 n
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]% P% M. |2 ]" Y6 O( h2 G% W3 r
  21. ; A1 ^6 f: D9 J! f+ H, \
  22. RewriteRule ^(/)?$ blog/index.php [L]
    ' l7 u6 a8 \; `

  23. ' h% U( ~6 P( }$ A. R
  24. ####end####( g! U9 e4 d$ i2 R- E  U2 ^
复制代码

1 u" e9 p3 ~+ o$ |( {: x
; v& S; ]1 A6 L! W" b2 w& S2 n
. T2 n# s6 x9 G# `" k" g& N
3 l# _8 ^% R$ u! z7 o7 t

+ A% F/ s, S* }
7 C2 c: Y0 R. J

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
3 @& |. X% }* y1 T# k7 s8 X% U, [3 Z$ ]1 H, X8 Z# v2 C! r
防盗链的语句,同样需要添加RewiteBase /,如下:( f0 l  }8 G+ r9 v+ u$ d. j" Z2 \
' l2 }- P! _3 \- d

[size=1em][size=1em]

  1. 8 W; m$ u" |: Z
  2. RewriteEngine on
    ! v1 p4 t2 S4 Z1 j1 t6 t& v
  3. 6 h: q, \* n  ^! s7 w) G& o
  4. RewiteBase /7 @0 V6 c1 c% {, i
  5. 4 y# v) c; ^' _6 C# q, E  V: h
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]" w" @6 W1 C: a! J6 g$ Y9 s+ ?

  7. ; ~* x. a% D8 q4 j0 u% t; A
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    - E3 ~! Q* g" T, k4 b- d

  9. # D* h2 Z! ?# a' b1 `( Y$ Q% w
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    4 j, @3 ^7 L" _: r$ }1 W
复制代码

0 ~7 n  A, o# L. H# V; m/ v  W1 U* v3 w
' Y) p/ M  J6 s! g) f, h
$ @/ X/ A9 G, W0 N1 R) [, S6 p
3 s& \+ m6 W, D* B; M& B- u

$ @* U: T$ }- J7 _5 }  O: b5 d9 _

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
! {8 M: X$ I6 Y8 d  c$ h! h- Y0 |8 c( x; Q0 j: b4 a
下面附上简单的语法规则和flags:
7 t1 V) `& K  n# z【RewriteCond语法:】; I- K8 t3 G4 ?0 }( @, Z+ S
RewriteCond TestString CondPattern [flags]* T' Z& S) e9 ?/ g2 J1 c/ u
rewritecond的其他用法:
. X$ i$ N. A7 J) q  g‘-d’(目录)( s. y; G+ k$ v7 j/ g8 D# l% ?
将TestString视为一个路径名并测试它是否为一个存在的目录。
6 {1 V% Y- v8 k  _+ h‘-f’(常规文件)9 X! I* B3 z# [' `. |& Z
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
( X! @7 N! U  _, p) }‘-s’(非空的常规文件)
3 l2 g2 {8 x; J& p- z5 V% X2 D将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
0 J4 K5 p* k  M$ g$ m‘-l’(符号连接)* Q+ n- s! ^" X, b5 v
将TestString视为一个路径名并测试它是否为一个存在的符号连接。) v& A: W7 W$ o4 T/ O. c- Q8 b9 j
‘-x’(可执行)
, b3 l5 y; g' p' F8 i' [将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
  g8 [+ o' M6 J‘-F’(对子请求存在的文件)
( v+ H! j2 c; @: @( `! }) J8 j& J检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!0 T- @4 |. \- s. ]+ o; h& i
‘-U’(对子请求存在的URL)
4 l0 _# {" g# W( s# Z! C. Q检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
3 ?* P0 m1 |, R7 E. U" I5 n% a5 X* h) Q: q& `/ z( t# y' I! e
【RewriteRule语法:】4 S7 {4 }% D4 p
RewriteRule Pattern Substitution [flags]
& o; H* @1 ~5 }3 g: e7 [2 q  G1 ]; [* z; g) @* s' g8 r
【flags】:) c2 N/ c; f) b, D& s9 R; c% U

$ E7 Z, E2 k$ B/ g2 Z. o/ {‘chain|C’(链接下一规则)
# ~  s. [- a& v. S) |$ A9 d$ r此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。: _9 j, g1 F8 n  i& n9 G; ^1 `0 g
3 b+ [6 ?# G- t
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)8 \7 F2 p  R% d( v  x
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
0 i0 G3 K* a- ~  T! x
. I( H* z  T: z8 ~: q+ t‘env|E=VAR:VAL’(设置环境变量)
6 G9 e& M5 ^: _9 b7 `: {3 d, J* J此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。( s; {3 W+ b7 y* l1 S
( v- R6 s8 P* R. S$ b. r) N
‘forbidden|F’(强制禁止URL), P$ e* ]5 o% K! s" u3 S4 L
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。6 T+ k* N& v" M7 n& \5 L7 }0 L  Z

- B" `6 w6 \4 l% _‘gone|G’(强制废弃URL). Q5 d1 S+ f( D$ b1 e( V
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
; C. v/ |! r& C7 d6 q. L& s0 ~2 O2 E
‘handler|H=Content-handler’(强制指定内容处理器)
' W+ I; r3 z* S9 O0 B+ p. c7 H强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
/ K$ N  ]6 w2 `# y- {& J6 W+ f+ \# R; z  `3 `  ^& n! f
‘last|L’(结尾规则)
) f6 ?$ n; W% b' r& a- ^$ H2 T立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
$ d+ e7 t; V( M: I  {# b$ \3 t. f9 q1 O: S9 X
‘next|N’(从头再来)
8 d" P; b; s, W8 `重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!9 g6 n  V6 D1 a+ E

4 H* g6 b: L# Y8 z7 |  P‘nocase|NC’(忽略大小写)
$ Z% Q- g. X; t- Y6 B; A它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
# b3 C. n* [' V$ [
# H5 n  U) f2 ]1 k- `3 u- s$ u‘noescape|NE’(在输出中不对URI进行转义)
, I* R- T  \7 a此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:+ \" r) \, c. ]! u* `6 V6 X
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]$ V6 m; n6 a; V4 Y, p, M
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。* ^3 Y8 B- |8 S; d$ P/ h( g% g
. ]( M# n  _1 p3 }: B' {( {& n
‘nosubreq|NS’(不对内部子请求进行处理)5 a# G' E+ _; ^( Z! b6 n+ {: o
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
8 x" K6 k7 f& ~使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
; e/ p$ o! r" i# X# L! k+ y
* E  U5 J3 {+ |6 R$ A‘proxy|P’(强制为代理)
. B( a4 R3 I4 N2 F% {, b此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
, `& L# r! Q5 F1 g: ?注意:要使用这个功能,必须已经启用了mod_proxy模块。
7 W8 ^. V; J' ]* f. j- h9 P2 U1 H- H1 |" Y: u' d! i
‘passthrough|PT’(移交给下一个处理器)  Z# b/ _; j. M3 K- S: {3 ]
此标记强制重写引擎将内部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,可以这样:
# r3 h! {* R! X7 p1 eRewriteRule ^/abc(.*) /def$1 [PT]* \7 W( ]7 P, a, e& D0 o
Alias /def /ghi
. Y- G$ [) o, O7 b8 Q如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。. r) E+ z7 a6 a" O: @- {$ T) |6 L
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
% o( i, p' Z! |& {' B' `  C- {( M
‘qsappend|QSA’(追加查询字符串)
* c, w' E7 u: q& E3 b0 J0 ^此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
2 u) o; K; I& r7 V. \5 C1 `* G( D: Q
‘redirect|R [=code]‘(强制重定向)
. ~" x3 d2 c# o5 `: e# T- @若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
8 \' y5 N% s* S* P% `注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。+ ]( }6 U. ~$ E/ K

5 P6 |  u% B2 d1 V. H  E’skip|S=num’(跳过后继规则)
( o$ O4 H# j7 v. h  v& v8 s此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!! G5 G: d: d5 p
1 z1 @8 C0 d! U' R% F* r" I' z
‘type|T=MIME-type’(强制MIME类型)
; |; B% L0 L( d4 G强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
% S, C9 ]& w9 a0 p  u. E9 X+ Q: `3 mRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
' q  Z7 d* D; N* F$ P



* q# v: x5 t5 M1 N

如果熟练掌握rewrite规则的编写,能够加强对网站URL的控制,对用户体验、SEO都十分有利。

, e1 y$ y6 L) k# Q. R  `, M# g

一、防盗链功能
9 X1 e; r: L) b6 G  a7 l: o

[size=1em][size=1em]
  1. % p& ~3 w8 v% [9 Y
  2. RewriteEngine On
      @1 U6 w' U" M( S3 z4 I$ H' h

  3. ( Q- T. V* J6 e" `/ T
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    / @) [$ |. r7 p( W$ K/ V+ S

  5. % U' ^$ ^+ x: x) a) X
  6. RewriteCond %{HTTP_REFERER} !^$7 U# m- w, k2 _* X* F& b% f

  7. ; Z5 Z8 w7 k( p  @4 K  V5 f
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
      r4 z* {# w& U! I
复制代码
; ^5 n1 f( M0 ?. r

* `# ^/ y9 X7 C! }% c' c& B4 ?

, V+ `7 _  d* N  a5 H1 D" S6 d* T2 r7 K# I# E. k# m% ]/ s

3 i1 q' I7 ^) v( H. }- W! ~7 i4 ^

0 P6 v& A3 Z$ Y# B5 u

逐行讲解一下:


5 t3 _" A1 c) C2 Z9 q! }7 x

1.打开Rewrite功能。有可能服务器设置里已经是全局下打开了,但是多写也没事。

2.RewriteCond指令,定义生效条件,用于寻找匹配条件的地址。后面内容用正则表达式匹配。代表含义是发送的请求不由mysite.com而来,那就是盗链啦。末尾的[NC]代表忽略大小写。

3.发送请求的主机前缀不为空。

4.RewriteRule指令,定义重写规则,把匹配的地址按此规则重写。本例中把这些后缀为这些图片格式的,都替换到某一个图片下。[L]表示这是最后一段规则。


3 M6 d% x8 a- A* F2 `- a6 A" K

只这四行就实现了防盗链是不是很神奇,编写起来是不是又觉得复杂。

这里总结了几个常用参数(不是全部):


& h' l9 ]* L1 S& J4 Z* ?3 b. s9 C

RewriteCond下:

[NC] 不分字母大小写

[OR] 用于连接下一条规则

4 j/ k, w7 q$ G: I; n9 o- G1 c  j

RewriteRule下:

[R] 强制重定向,[R=code] code默认为302

[F] 禁用URL,返回HTTP 403 错误

[L] 这是最后一条规则,之后内容无用


2 {" d( A0 D( g; h

还有一篇关于正则表达式的教程(很详细):

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm' H9 A; h" ^6 ]

二、网址规范化

[size=1em][size=1em][size=1em]
  1. + w7 W7 T+ A& O% l# ^, }! v
  2. Options +FollowSymLinks* H0 a7 z1 z) D
  3. " R; _  y2 X) `; j+ q' n$ K; e
  4. rewriteEngine on' L9 ?( G7 Y& o" [

  5.   \) k" z: K, E& C3 Y. p# g
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    , H: C$ t3 c; X* m3 e3 c6 [

  7. * A2 w* m9 Z+ p* y8 P' o2 J
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]+ C, K2 S$ c+ R  I
复制代码
  `) \, `$ v  |' P" m6 {8 m2 B
% c! d7 H% q' ~7 c6 @% u

8 S' G3 ~1 H, \) q* @
( _4 E5 W+ y0 S3 d8 f

" @' F, D! s) R0 p9 d$ B
% ^; ~9 A5 [0 }

这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了?

需要注意的是,这里的Options +FollowSymLinks不是必须的,但在某些服务器如果不设置FollowSymLinks,可能引起500错误。

2 g! a6 m/ ?6 a7 b

再来看一个好玩的重定向,把google蜘蛛指向某个网站

[size=1em][size=1em][size=1em]
  1. 9 m, H- v+ k& w* q4 W" V$ c
  2. RewriteEngine On- u: e8 k: B4 K
  3. 7 b/ a9 W" X0 c( c
  4. RewriteBase /
      k$ \9 [5 v  o7 \: V" j
  5. * r4 u) V2 T. F; `+ b; i2 p
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)" r) U5 d& D9 R* p

  7. ) S2 r3 o: S, B/ f% p0 K
  8. RewriteRule ^ http://abc.com/ [R=301,L]7 V" a+ N" W" |
复制代码

, T1 O2 B$ l; G4 S; T/ v8 x7 L1 m; L% u9 P$ Y

/ D+ ^; q; ~4 D5 g+ r
' y9 C) W# N" p0 D
9 i& G2 o, k! m8 B  r" h# C2 w8 l' n7 v  }) H2 ^$ J  T9 U) I8 n

1.打开Rewrite功能。

2.RewriteBase指令,设置目录级重写的基准URL。可以理解成把该目录(这个.htaccess所在目录)假定为基准的URL前缀。本例中这样的写法无用。

3.RewriteCond指令。匹配所有USER_AGENT为Googlebot的发送请求。

4.RewriteRule指令。本例中把这些请求都重定向到了abc.com。

4 @3 W5 }! ?& B  G9 H

在本例中,这个配置应该是黑客所为,把google蜘蛛指向某个网站,等于伪造PR。


3 h8 P# p7 X+ M4 ]

三、临时错误页面


7 |1 z/ ]" c) O: |+ V+ [# Y' ]

当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。

这时我们做一个302转跳就好。

[size=1em][size=1em][size=1em]

  1. / o! ?6 c9 S8 ~9 y
  2. RewriteEngine on2 l4 C6 f( x. o
  3. - J# l0 {9 l9 }) G
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$" [" O  ^7 u+ j! [" E/ I  n4 Y
  5. 4 h6 l- K- n4 K' {% @
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    " R; ?# q3 `4 f% l" Z/ i

  7. & b. O9 y# F3 j
  8. RewriteRule $ /error.html [R=302,L]
    ) @5 m; Y7 s- f; ~0 |3 {* v8 @2 ~
复制代码

5 A- ?( v: U% B; K* ~7 L
( W6 |  D) p% Z( K3 Q1 M& j

9 z# l6 A) P3 ]6 B- t( }8 E5 _, y9 H# L9 i0 k5 a; h
& ]$ e' X& c) P* k" k. T
0 y3 G3 I% p' t& N% @5 n

1.继续打开Rewrite功能。

2.REQUEST_URI,请求的URL值。这里指所有访问maintenance.html页面的请求。

3.REMOTE_ADDR,向服务器发送请求的IP地址。本例中此处应设为你自己的IP,这样就只有你能访问。

4.RewriteRule指令。本例中把这些请求都重定向到了error.html 。


' O! {8 o$ t  S/ D0 X

在本例,我们总结几个常用的正则表达式和特殊符号。

/ H! O3 q2 n+ _# ?

(.*) 用于匹配某一区域内所有内容。如 abc/def/ghi 可用 (.*)/(.*)/(.*) 匹配。

([a-zA-Z_]+) 匹配英文单词,允许用-和_连接。

([0-9]+) 匹配多位数字,通常用于匹配ID。

([0-9]) 只匹配一位的数字。

# |2 U0 K0 K9 x5 r; ^7 w: W

^ 表示正则的开始

$ 表示正则的结束


4 G6 G$ h9 X; b8 d4 u; d: R

四、重定向RSS地址到Feedburner

& ^8 n" J$ Z0 \

除了可以更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。

[size=1em][size=1em][size=1em]
  1. / k$ ]# k; W# _$ `! E+ Q
  2. RewriteEngine on
    2 D; G/ P) \; ^: R$ t4 V$ m
  3. 4 @$ B" P9 U" ~' e9 z
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]# t; e3 _! o$ t) R
  5. ) @) a: t" R" {6 T3 w2 t
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    ) h" p, g) V4 n7 c* t& M( V  u
  7. & c+ ]8 \: j2 N: |% _$ }+ M5 ~
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]: y+ h9 M+ r& R" X# ^) }5 [
复制代码

  G6 i" Z. E0 U5 e8 S; i9 V# t# M4 {8 p$ [; c' M. z
; \  m: u4 ~  V2 y& G0 e4 \
* v) f, u* {, r
! Q8 _/ W5 ?, {) n( z
) k  o& p0 b9 l2 A; w

有了上面的总结,本例其实就很简单了吧。

唯一要注意的是这样操作要确保填写正确的HTTP_USER_AGENT。其实你不常换模板的话。。可能还是直接改模板更省事。


  ?5 D0 q9 |6 N( _! H3 I1 C

在最后,推荐几个好东东:

在线.htaccess生成器:htaccessEditor http://www.htaccesseditor.com/sc.shtml

mod_rewrite模块中文参考手册:http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html


, [% Q& ~  g4 s9 `  X  d0 D8 ^
5 ], t. h5 }" g4 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 17:05 , Processed in 0.151060 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!