cncml手绘网

标题: .htaccess中的apache rewrite规则写法详解 [打印本页]

作者: admin    时间: 2019-1-4 14:36
标题: .htaccess中的apache rewrite规则写法详解

.htaccess中的apache rewrite写法:
6 i2 E- ^2 s# y1 ]* t8 G1 M
0 f* `  K# X( Y5 H6 V* ^5 U" M

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

  1. , N9 d) \- `  V/ |* c. j4 M: z
  2. RewriteEngine On
    ( e+ Q# D" X: z( t

  3. , x6 e) X. {' C/ w8 ~% L$ S# Z
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    - j" p, g% ]9 ^5 T" P* s' l- V& h

  5. . t/ y" Q: }, Z! Z/ n8 O3 C& E
  6. RewriteCond %{REQUEST_URI} !^/blog/
    6 g: |: P# H, y5 k7 T6 O) x- e; C

  7. . |) \' T" y% P: _) H0 j9 q/ G
  8. RewriteCond %{REQUEST_FILENAME} !-f8 h. Z* p" I" M+ g' w- V! t/ Z& Q
  9. % _. l  t4 B7 `5 ~
  10. RewriteCond %{REQUEST_FILENAME} !-d" t$ V& f2 B3 y/ R* P+ c( E1 f1 U$ y
  11. 1 j2 \: O4 o& `1 z
  12. RewriteRule ^(.*)$ /blog/$1
    ) C# s9 j9 @9 q; J' b

  13. ) j1 y: b# t3 ~- A( I2 v, J
  14. # 没有输入文件名的默认到到首页0 x; R9 k, {, ~' {! A4 R! y

  15. 2 J: `+ u. S5 ^4 s  \' O1 P, a
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    " Z8 z" @' `* Q: `* b' ^! f% Y
  17. * z* _" |( T1 y" z
  18. RewriteRule ^(/)?$ blog/index.php [L]( T9 ?$ P) d% Z7 L$ C- n
复制代码
  @* U4 V8 V& j" c
1 x6 q# Q+ T, @) M6 s
: k! ]3 n1 g' u2 \9 W3 m; W

  \0 t1 v$ i7 d/ k1 a
( e: Y& [/ g8 J- \' [- H

- d9 ~% \4 b9 z+ B' R% N

下面我开始解说一下上面的意思:/ `4 W# ~2 Q5 ]3 g

% {$ B9 d0 u: K& w1 Y【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
/ Q8 p& n0 k) m7 @+ |  {, c: i
% P$ B* h8 q- \& r6 j' v, h【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
" k# `5 E# M& A1 X( t1 W% B这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。, E  i4 W. l( }: ~) U( K
# f. v/ N- n9 s
【RewriteCond %{REQUEST_URI} !^/blog/】
$ {2 K7 \9 b; U也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
8 {( A2 z$ c# ^  m) L% d: I3 T! b4 R5 ^* x0 S2 c% v' {- ]
【RewriteCond %{REQUEST_FILENAME} !-f】
0 ^. z# K* C* e, Z) k5 Q. Z: k【RewriteCond %{REQUEST_FILENAME} !-d】# S3 p8 Y0 H" p$ g: T
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
: r' m  h4 B# s& U, U: c& P2 z& W6 \4 g! w) x+ q
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。$ W5 ~* Y: l. L, f6 _% o# I
: F2 l* y( s( Q0 R# }: j- r
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】, g; H' h9 m1 k5 M6 W$ h
【RewriteRule ^(/)?$ blog/index.php [L]】$ N* a8 g% h& z& s6 k( u. I. E$ a
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。# K# n5 z1 g# z, d% m
% d8 A' r, t, ]1 x
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
6 c! K8 h, B0 g. e答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
" _  w; \, w& O- W  ZRewiteBase /% C- |* g/ U, H

6 ]& A: h( H& |) k% ~6 z还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
8 d& N$ Z8 `: _/ n7 A& n至此,完整的语句应该是:8 U7 U2 v& [* n. ^3 A7 d

) H' f4 E8 V4 O% ~. Z. r

[size=1em][size=1em]
  1. ; }# K- p3 R; z- Z
  2. ####start####' S! i; e5 z( g* V4 E
  3. 4 V, x" q) V" d; f9 t
  4. RewriteEngine On
    5 q5 S8 |- x) N% L5 @3 N3 ]

  5. + O/ @6 ~( c% N: g
  6. RewiteBase /
    4 x6 ^1 O8 }% U3 ]7 W+ s

  7. ( M3 Q* Y' m$ B4 w# L* {
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]2 n  w/ i2 A8 e6 p: t, h
  9. % t! e/ \( u) Z
  10. RewriteCond %{REQUEST_URI} !^/blog/
    " _2 w: ?9 R8 y+ C9 b0 t7 g

  11.   O9 Z, M" U2 i, D' o* L$ G: x- S
  12. RewriteCond %{REQUEST_FILENAME} !-f
    + F6 W5 O9 o% V

  13. / `# G( u6 o" C; ~
  14. RewriteCond %{REQUEST_FILENAME} !-d
    , B/ ~- b! E* Y. t: V# ]$ k

  15. 9 r* c2 F/ m8 V  }" k2 D4 j* W
  16. RewriteRule ^(.*)$ blog/$17 A1 {/ m8 ]% Y4 e8 `% p
  17. 2 z3 D2 a' Y, e4 |& o1 ]* Y$ H4 y
  18. # 没有输入文件名的默认到到首页" a! Y3 J: O0 v* ]0 M. s$ \( ^) T# b

  19. * n5 I7 S( [5 ~) L; M! E! L. Q% a
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]" c  Y) K: c& u0 N
  21. * E0 H- S* h( v  H# F' y: q" h* Q/ x
  22. RewriteRule ^(/)?$ blog/index.php [L]
    + L3 I$ u) |( T6 r: c. Y4 J+ D, s

  23. 0 r& W9 {# q3 K4 H4 a
  24. ####end####( O8 c7 s( r: D  l9 A/ R
复制代码

* |+ a' H4 l& w& [( Z# @! {6 `0 m7 z- L
/ ^0 @' }  K. x/ E" a
. w2 ]1 |+ J) B- Q2 C. N! p" W

. q0 h) N8 U$ H! ~
( L: M: R; l: M# \8 Z4 t5 U

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
# F4 `9 @/ g6 X+ D' R; m
& I6 m+ y4 Y# @' a+ R; J防盗链的语句,同样需要添加RewiteBase /,如下:
7 R  ~4 P$ Y6 {: @( T% Z, s8 v: Z1 F- C9 _  `; W+ E# H; Y) i

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

  1. $ ~3 E  c) n* N3 v
  2. RewriteEngine on
    9 m+ C) x1 r; \& \, H. U/ W

  3. $ X3 P  \1 b2 ]
  4. RewiteBase /) }; L, p2 Z" ^
  5. , A* D/ \" Q, p" I' _% l' y; C
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    ( e( o# B* [1 G, O" L
  7. 4 A9 o8 h: U2 _3 n& J0 o+ ]9 {
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    : `2 c3 r; o4 J& n

  9. " B: S6 a. F5 r, ^4 w: Z+ K
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    % g: z/ W. ]0 t$ s) V
复制代码
: g) K& ~1 U7 N. q" D; o2 B) v: m

3 u, [+ M" j5 o
9 P; K! x3 r) x
1 t7 x; W6 S  l3 |; J/ v" \
- m4 j; V( {3 O$ G, X
8 p% M  e1 q. u5 r7 s0 |" U. O

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
1 c' ?/ d% }. g: r& `3 ?4 d7 @+ w" c/ Z, u- h9 u
下面附上简单的语法规则和flags:6 i* j8 [( D, D
【RewriteCond语法:】! N- ]  U1 a: ]
RewriteCond TestString CondPattern [flags]
4 b% I" p( P+ u0 E5 Wrewritecond的其他用法:) O: }% u* ~) A
‘-d’(目录)' i) F& A; B% _( z2 d' j  Y; F
将TestString视为一个路径名并测试它是否为一个存在的目录。
3 ^8 ?$ ]  h. w0 _7 Y# v‘-f’(常规文件)' H+ E: S4 ^$ g/ s% b4 |
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
( Z4 ^- U6 N$ [9 \  c‘-s’(非空的常规文件)
3 Z1 g1 E" I% ?, p1 R( R6 @将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
7 \! F1 B: f* f" m; a‘-l’(符号连接)+ G7 T0 p) t3 \
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
2 T6 O& D8 f7 f. K  X9 q: H! Q5 U9 |# r‘-x’(可执行)3 H4 a& @" I% [7 h* P
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
4 Z! j% S2 h9 _( P4 |; O‘-F’(对子请求存在的文件)
  J; |) a' D" A6 P检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
( w! ~2 z) A9 C$ g8 X% c‘-U’(对子请求存在的URL)
7 z4 }# Y* w( k- q+ h, Q( K" W" h' q检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!7 s- z3 Q( r( k. P5 |: H
5 T9 a8 L5 U1 s/ |; e4 o
【RewriteRule语法:】
/ }3 Q1 H, @. j9 m. G' s4 T) lRewriteRule Pattern Substitution [flags]* a( }8 m3 y' J# N
0 D7 Y7 t) b( f' U
【flags】:
+ S, x/ R1 O5 X/ @/ \
( f# G0 ]" X! ]‘chain|C’(链接下一规则)
/ N* V3 [% R$ v& C/ ?此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。& a5 u  p- j( B
1 y; W) D  e; f) h& c  s" P, p5 t
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
, F* V# [7 `- i3 d在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
) D$ R8 @# K# o3 H( @) c/ e
: A3 c" m# |# T! t‘env|E=VAR:VAL’(设置环境变量)
& V  }1 p$ Z% Z  _此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。, Z0 F* ^  }1 {9 X, E* a5 G6 z

2 a7 w- L% Z4 J/ [  n* o‘forbidden|F’(强制禁止URL)( C9 Z* V- T6 q/ L7 [
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。3 \. L3 I% u$ S$ m/ N" V4 \
4 G. _$ m$ a: N* P' n( t
‘gone|G’(强制废弃URL)
4 q' w  l9 h- R8 N# e- f# x, Y强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
2 j: U3 `% z: I1 L* b. o
- f; W# B1 e" z, j' C9 H) }‘handler|H=Content-handler’(强制指定内容处理器)
, @2 v  |2 s2 P. m$ r. i强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
" X9 P/ P( p5 l9 m( b5 k; K8 B: g0 [; ?7 ?) n
‘last|L’(结尾规则)( s( l, u. e0 r9 L: t: n. ~
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
* @, F6 g4 H8 X6 y7 Z5 S' E3 y/ E5 i1 i) d
‘next|N’(从头再来): k/ z, a# [9 M6 a9 [: h: m
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!7 S6 Z/ R: T) V2 Z' c0 d
$ ^5 G/ N4 `/ y1 D& ~9 V! [! {, O
‘nocase|NC’(忽略大小写)
+ @6 o- S- `6 R# Y它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
/ J& a6 K' z3 c& F  l$ F8 y3 D1 g( }  s! g9 V
‘noescape|NE’(在输出中不对URI进行转义)4 C9 [8 `0 q/ L, d
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
& d8 c, W0 Y" ^6 W# q- I4 lRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]+ h8 B: h8 H1 ^
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。. }$ V8 g8 u# `, U2 k( E8 |, V
: m! T- S4 P5 q/ u& P5 o
‘nosubreq|NS’(不对内部子请求进行处理)
+ ?" j; N1 f( g0 }# e0 r, U在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
$ v. P- b" w2 u; `使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。1 ?3 b& W" `) }2 C5 Z" {

! m( [7 n; T" f8 J: v‘proxy|P’(强制为代理)
) S1 u  H4 E: R7 h3 J5 x  C此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
, k, E  b5 w$ M8 _2 Q注意:要使用这个功能,必须已经启用了mod_proxy模块。
, g/ {0 Q1 y* a( A5 ^. A, ~) r
: Q% _# m( P. `% }3 j‘passthrough|PT’(移交给下一个处理器)8 \5 C9 }( y% G  Z' X# }1 y
此标记强制重写引擎将内部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,可以这样:
/ O3 U5 w" q0 F5 f6 R9 [, `RewriteRule ^/abc(.*) /def$1 [PT]
" I6 m; }# T2 _& W3 UAlias /def /ghi
( |9 ~8 E( j! t# {- L! `. c/ a如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。5 Y' ^2 x1 B1 C3 ?% r8 ]) l" \
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
# N. S5 O1 ?0 Y2 W7 w5 k9 g  @9 M6 Z
" @* v$ g) A9 r+ k‘qsappend|QSA’(追加查询字符串)/ Z4 U& h6 C% H; v
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。( K+ v9 X" \. V0 T9 e! H/ [2 a
$ ?& D: I, b2 @- n
‘redirect|R [=code]‘(强制重定向). O1 b, \* V1 {5 X
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
2 L# E; q$ M0 o$ p) q注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。/ Z" d; t4 w7 l# a5 T

% E( `' d/ y' q. J$ N; m. W' \’skip|S=num’(跳过后继规则)7 S+ n- c: E6 k5 G! L, i' m, p
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
( |6 B! ]" L6 Q1 L1 p, L$ M8 A0 d# K1 n' X6 U
‘type|T=MIME-type’(强制MIME类型)9 E; ~, Y* |% ~4 P  \
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:4 L$ H3 K$ s4 E0 m
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]3 z/ U# R: s# {1 Q3 I0 \


: V* r2 o0 Z6 z% B$ U. ^: D

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


; m- C) Q- j2 Q- q) \  l0 P3 S

一、防盗链功能
5 o/ a3 _2 Y7 O9 t4 W4 w* k

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

  1. * h. [: H+ O; O7 n& A' i. w2 S, t$ v
  2. RewriteEngine On
    % @) L& c2 s: ^5 f

  3.   Z) J$ d  u) s& q, M* J! Z
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]* R& L' U( G4 J8 ~/ r

  5. 0 t( [3 \0 Q! G1 A6 i0 h3 Z" W, T! ?  w
  6. RewriteCond %{HTTP_REFERER} !^$, A7 T2 w4 N- n2 F, m$ |: u$ l2 w
  7. - g/ g" U  b. D8 Y$ M
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    # E% L8 ]. Y5 L2 g1 f+ S- R4 r
复制代码
) Q1 m% W( A' u- \+ k% n* R
/ l" a2 m5 M  \3 |: \; y0 s& ^9 s

' R7 i) {( ^2 m; h* K% ~4 r: m+ H6 w2 F- o* _

7 Y# L4 z* ?. V
& U4 ?$ J' L' }2 r5 d8 k

逐行讲解一下:


' B4 R8 S+ z) j0 U9 O

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

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

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

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


4 w2 K: j" V) _  V8 y7 o

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

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

1 b7 @/ A% T3 j9 W) n% _7 e/ U2 w6 B

RewriteCond下:

[NC] 不分字母大小写

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


7 I, v/ n8 J, O- s$ I) V" F

RewriteRule下:

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

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

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


; C) E8 v) v' V% j4 ?. `0 Z3 P" ^5 _% ?

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
: M7 i. j8 d9 [7 b* k# \8 ]' }

二、网址规范化

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

  1. , r2 a* G! O4 K* m* H
  2. Options +FollowSymLinks0 H" m$ S: @5 C: c+ T

  3. 0 b0 v( {+ V* L4 ?
  4. rewriteEngine on
    # ^( L/ j9 A% l+ n4 w* G' @2 N

  5. 5 A3 J5 s2 E% ~0 z7 c
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    # n- @$ m3 n1 m- a5 z. a
  7. ( ~# X* q0 P2 p  d0 ~: S5 B9 y
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    ) D" H$ K. W6 m; m! R
复制代码
7 }0 S5 j$ }6 y9 V, ^
7 n# `$ J0 Y- z
3 F$ n7 V5 X; f6 a: s& ?" x+ B* q

" z0 K) q. B# |9 X

/ m" w6 u8 {' k# q9 v
; i- e& V" W; l1 A) h) }3 j  e6 k# E

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

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

4 z/ x( a2 g" T1 l4 w* F: `. p1 M. k/ `

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

[size=1em][size=1em][size=1em]
  1. " w5 l8 b& a5 P6 c
  2. RewriteEngine On
    0 K" v4 R3 z- {' `( W

  3. ! |+ a" M. u) A+ `$ n2 g( e
  4. RewriteBase /: n3 ~" R# ?: I' w! e0 {

  5. ' x8 w& l# L+ E4 i3 x
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    6 Y/ `/ [0 G# C8 s2 q3 `* D
  7. 9 M: ], {9 ~8 r7 }- k- {
  8. RewriteRule ^ http://abc.com/ [R=301,L]  X, p: |8 H4 ~3 h/ p. P
复制代码
' g; W6 U3 u' R: ]( O
4 p+ b0 a+ a) }) }
/ t% R. ^' i( s5 `5 D) M

$ e1 ^, ~; y; Z8 z& M! }
& g2 ^# C6 j! t: V8 g7 v" A+ t% B8 ~, |7 S

1.打开Rewrite功能。

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

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

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


3 B, t$ ^  ?3 ~! c

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


5 a# V+ o. q+ j8 U5 S# l9 I

三、临时错误页面


1 T# l) C% ^+ P7 |. g7 m5 z

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

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

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

  1. / l2 g2 b( y" f& J
  2. RewriteEngine on
    2 Q* x2 V# B6 Q- _; k, q1 I

  3. * U% w' p1 t8 a8 t6 Y, w
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$0 y# L5 q& E/ I0 E3 I, [, Z
  5. 0 R6 i, Q" l" B* P3 q/ s# a+ K! H
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    6 H; F+ h8 Y4 e; J% D+ I9 g: w5 I
  7. * O6 c/ [' q0 G$ @
  8. RewriteRule $ /error.html [R=302,L]; U7 Q1 g0 P- c- ]' s% o% e
复制代码

; u: M; z& y6 Y( I, U% B4 w7 ^0 x6 X0 P/ x) @( u: @, p5 L
$ I) v& b1 i) s; k& ^4 P

2 Q5 l1 H" j# ?) a3 U0 W! m6 `# v7 z5 x. v( S0 u! L
/ {4 v) F8 n: f* s$ }

1.继续打开Rewrite功能。

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

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

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


0 B0 w3 q2 u5 m/ K+ u; B, s: t# y

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

  p9 m3 h: C8 K9 V2 T$ `

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

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

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

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

$ @  C. m/ G6 b9 ^8 s7 _

^ 表示正则的开始

$ 表示正则的结束

2 i. _* v  Z- G( ?) m" E. N" {

四、重定向RSS地址到Feedburner

7 c' P* v7 u, O+ A) Q

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

[size=1em][size=1em][size=1em]
  1. 3 E' M8 C. j7 T' r4 F
  2. RewriteEngine on
    ! {) a2 e3 u5 g5 W/ Q2 w# S. S

  3.   N4 I! d( n% F! y8 u
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]; V! `) _; `3 o6 a
  5. 3 K% @8 ~. w6 }# O& N3 g. b! ]: P% x
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    ! ~1 p/ R5 Q; Q# Y% W5 l
  7. 8 t( o1 v5 H# G: C7 u
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    / a  C: Y" d3 Q  N2 F8 G; O: D
复制代码
* |- s* O* g- {9 _- [

# T" o) W7 |, N; m* s4 |
! a# ]6 Q* l1 |$ U
* S" J9 H" r2 e9 D* l5 O4 a' h

5 U% n& J0 k7 v+ x; V6 j. Z, X- w6 r$ Q: a

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

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


9 m9 s' h- X& z" C- O4 j" Q3 A

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

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

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


1 u* Y* @' a- v+ E+ c3 [7 N; E; q





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2