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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:( H0 }" ^$ J6 ^3 U3 W! E2 W6 ~
/ N& v( w  i! `6 W: ~

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

  1. 7 i  _, e' Z$ D4 B* m! d
  2. RewriteEngine On7 o# d2 |( j4 M2 L  ~! W
  3. ; [7 P# a5 T; p: O/ Q& f
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# @3 f8 Z9 ~7 c  t, y
  5. % n0 [. l- d& H  Z; @; E, N
  6. RewriteCond %{REQUEST_URI} !^/blog/) @% c. J, h6 `! N" ^

  7. ; T/ x, H% g$ p, ~5 b
  8. RewriteCond %{REQUEST_FILENAME} !-f
    9 T5 z$ p7 L" ]; y, Z

  9. + ?/ R" G  V0 ]/ _& i
  10. RewriteCond %{REQUEST_FILENAME} !-d& n& h3 D* v7 W' _2 |9 Y+ t
  11. , M# n: P" i* ^
  12. RewriteRule ^(.*)$ /blog/$1- E9 s+ [, e2 j, l% S
  13. 9 {, |# D+ r4 _
  14. # 没有输入文件名的默认到到首页. B. P) O$ ~/ X
  15. 3 c. O$ n" ?* O# I+ {
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# H5 j3 Z3 p( ]- v0 J9 @  f5 W
  17.   s+ `6 |  [+ z4 G% n$ o8 x
  18. RewriteRule ^(/)?$ blog/index.php [L]
    * \# ]* @# x# k! K3 G( Z
复制代码
8 T# s: q7 N! o6 y2 k5 f$ H

& u: I$ @; V' O+ f/ `
  L7 \3 d2 A+ N! D; O3 @8 y- P2 x' h

4 o9 ~, R) a3 k; J7 X
8 Q( u! @9 e# C  b0 z  |
7 T: v3 Z0 n% e) w9 W6 S

下面我开始解说一下上面的意思:; v- Z# ^# _+ ?1 |

; e8 x3 T# J, a' h4 G3 t, m3 T【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
. ?6 K$ m8 s) o6 U+ x% e+ J2 c# b4 P- P9 m! p/ U
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
( q" z( a) [9 F2 ~/ t; D这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。7 N. o( [7 ~4 n' G
1 y* d) G0 K; H# S+ p
【RewriteCond %{REQUEST_URI} !^/blog/】
: L" x& D- V  a; @也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$3 [  j* {9 N* n: M1 U: X

7 @$ A; H$ @% {$ [9 }% {- n. g! q0 {【RewriteCond %{REQUEST_FILENAME} !-f】) W$ ]( m1 {8 @( b" l. N
【RewriteCond %{REQUEST_FILENAME} !-d】
  o# O- r9 Z8 A4 H1 A: B4 N这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
+ u- u: O: u' w5 n* X6 f7 ?0 t" y3 O  Q( o$ S  j3 z% P" }* c% H
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。: j& S+ z' z4 Y: J

) J3 `3 w0 u- H' V. J- C8 b【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
; Z5 Z% j1 n. i; H7 j【RewriteRule ^(/)?$ blog/index.php [L]】
+ h( s$ Z0 v/ c, v2 }1 i% z2 l这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
/ ~; |- b  B8 q0 t9 B8 t) r, i2 X
$ @& i# B1 [8 S5 U% i9 z/ K1 L现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。2 a; Z) J* Q$ Q; i. w
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
4 R% E2 p" S# B* fRewiteBase /
5 R. [: u$ n; N8 V/ c; K% J% @& O. [* Y2 D6 I1 r
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
+ y4 ]' \+ v  T至此,完整的语句应该是:
% ^8 ?" M1 o0 f4 ]7 x' P
1 j" L+ Z" p$ x5 g* V# b

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

  1. # p5 g4 Y/ l- d5 a+ x4 u9 a; Z
  2. ####start####
    # ^6 b7 l1 J3 H! \" l
  3. 1 y: M' f# y1 V9 s4 @7 {8 |
  4. RewriteEngine On
    5 O5 r9 E0 s" S8 [

  5. : n( h0 P2 y. g! x+ X
  6. RewiteBase /
    # u$ G3 M5 N/ b  _- q5 z
  7. ' B1 ~9 W. j* @" n. b9 X: l7 p9 t
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    , r! t' z9 i) @# F' w
  9. $ j1 e$ O5 k1 U* F& y6 k: W5 C
  10. RewriteCond %{REQUEST_URI} !^/blog/
    % k+ h; \2 B$ n- ^- G4 l; f) ^

  11. ( q' i' Z, J2 _1 f
  12. RewriteCond %{REQUEST_FILENAME} !-f
    ) l0 G2 e* A1 i
  13. ! y. \; C1 N* b5 P
  14. RewriteCond %{REQUEST_FILENAME} !-d
    + \2 Z" u. l& [! _( j. d/ C1 `; f6 o

  15. * f: D' v& _8 p! U/ O
  16. RewriteRule ^(.*)$ blog/$1
    9 I! z% Z$ u$ E* K. {

  17. 4 b0 s$ G: Q4 W
  18. # 没有输入文件名的默认到到首页& W9 E' j, R; f! t, x

  19. # J! R7 V  O0 h3 N2 X8 a2 g
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]' }) e+ R4 g" V/ B! e/ h* O& j

  21. : w' C) ]4 z) X( T
  22. RewriteRule ^(/)?$ blog/index.php [L], U1 C0 e9 D" V8 X

  23. 8 j8 v( N1 x8 D* s
  24. ####end####: y; V# q' J6 D: ~8 ^& W+ ^, q
复制代码

6 d: d: f6 ?" r+ H0 m( V9 b) ?) h2 \5 s

4 B# ^" L) ?2 R, @8 r+ g
4 t) l) A# u  Y" d

9 K- C# v& j+ y& m: v0 W/ J
0 s5 w! B1 z  T% v3 w

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
, W2 K! b1 @4 H3 ~1 n! J3 K8 j5 n+ Z) W# _  ]7 I5 |) W4 x
防盗链的语句,同样需要添加RewiteBase /,如下:
4 F  n" I: _1 n7 e( }& i& j( k( `, m% C  j4 g

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

  1. . C6 t" Y# a: H' ?$ |7 q7 t5 n9 L* l
  2. RewriteEngine on: P* m+ k# P' b$ k, m9 k) H! i

  3. ) O3 Q" X* t' V
  4. RewiteBase /
    7 a( Y8 a" f8 K7 q5 f* B! p0 [& k
  5. 0 A2 i3 `( w5 E  x7 T* ^
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]9 x6 M3 n( n1 L+ e. y" k

  7. & X, P- H, f9 o3 K
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    ; j3 _. C2 x, V4 j% [

  9.   f; J8 b) K& ]3 m7 |6 ^9 n
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    + q- r( j0 e4 s7 u
复制代码

  H% v# X4 a: R3 \# B% l$ j% L3 D' t7 F9 k6 H# {" [6 T+ V
& K# ^; \9 A5 a1 z

0 H6 t7 ^, _' H, c, c4 I

4 a3 C2 s: K- N3 y

. Z: _$ ~' o, P# B; r

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。) m1 q1 }4 |/ n  c

0 v6 l, n+ p9 o& K- Q$ Z. O- G8 E下面附上简单的语法规则和flags:
4 l5 Y6 y6 _1 C7 o. s5 [' V【RewriteCond语法:】
- L" N2 B+ _3 pRewriteCond TestString CondPattern [flags]" S/ s- d+ ^# I  r
rewritecond的其他用法:  S% R2 }( z6 \( F: K* A
‘-d’(目录)  f  @2 G3 W8 M( T& {9 {5 ^! Z1 V
将TestString视为一个路径名并测试它是否为一个存在的目录。+ P+ |, p0 ^3 ~4 A# F8 h2 X
‘-f’(常规文件)6 h& |( V: n/ }4 Q4 w
将TestString视为一个路径名并测试它是否为一个存在的常规文件。) u2 l7 \0 ]; ^+ z0 B
‘-s’(非空的常规文件)
! p" b* g! C+ [4 M  P/ F# C将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。$ @6 S: G( g8 u5 p8 B" _, _
‘-l’(符号连接)* Q& o+ j7 I; U& F) X
将TestString视为一个路径名并测试它是否为一个存在的符号连接。5 p8 H( A0 q9 w+ S1 ~' e
‘-x’(可执行)
) k3 i, A0 b: ^) X6 v5 Z, J: A# F将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。, a! W! W+ r% a% Y( p
‘-F’(对子请求存在的文件)
& a' e2 r: u# z3 b. f9 n% W检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!4 \  \# [: a! b. \; |
‘-U’(对子请求存在的URL): r' ^3 w+ ?6 z1 }
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
8 Z6 d/ c, D% C) N( C1 X8 d8 h$ g6 f' J1 \8 n. ^' @
【RewriteRule语法:】
/ t' [# G( y0 `% z# E9 YRewriteRule Pattern Substitution [flags]
0 [$ k! C6 O. T* Q) i' J3 y( G" h4 H2 c) _0 b2 {! Q4 `
【flags】:
9 y) J8 e) I5 m0 k
0 H- r" V' w: ?+ P1 Z. h  i7 ?7 F‘chain|C’(链接下一规则)
8 y. Q& m( E5 ?5 r7 l" @7 _$ q& G此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
; F- n# [" |, i
6 ~3 D5 S  i0 O+ E1 ^* X‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
, q% a4 v- a. c  l( c( s* ]; ^; D在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
. ?' G# S, L+ f8 V1 z  a( l0 e% Q% C7 z* k
‘env|E=VAR:VAL’(设置环境变量), H8 @5 u) e* u& b3 G
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
) D" T) c8 ], D; Q
% j5 @8 @4 O) x! {8 Z! [5 R‘forbidden|F’(强制禁止URL)' a$ k5 v! X4 }
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
6 g% ~6 c0 s$ S, k6 g$ E. d; C/ f$ l3 e( f) R/ F6 b. B
‘gone|G’(强制废弃URL)2 h. q5 z! _1 G
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。' K! M9 a  \8 C  K4 C! b
- a5 f% o2 T/ p7 y" d
‘handler|H=Content-handler’(强制指定内容处理器)
+ l. a  p! v2 U5 x/ ~: `* I强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
. n, {3 X$ T( l
: I1 ~+ m3 O9 q‘last|L’(结尾规则)
) h/ r  d. J, [! K' k9 d! ^* j1 y立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。7 r- }+ R# s8 ?1 w( @

4 s) R  S! B9 {1 R/ B$ m‘next|N’(从头再来)7 W. y- f  l, E
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
) y6 q# Y. D5 n2 m8 o( t- o& g  N
% ^# w+ j  r  o0 V9 I6 B‘nocase|NC’(忽略大小写)
3 i* G& C  j: v2 z4 d" u它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。! o  }  T* @7 j8 m

: M$ f6 X1 g8 l/ Y6 {/ E( T. e+ i! R‘noescape|NE’(在输出中不对URI进行转义)
4 \( v& e( S4 V5 K2 J此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
, b# l9 @' P2 Z/ A# ^/ S. u3 sRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]$ |* ?" ?" v$ O
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
% d( K1 x( O* o! @: A$ n2 }4 \9 t5 D* e1 _5 E
‘nosubreq|NS’(不对内部子请求进行处理)/ i0 z: `4 Q* ^* D
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。! I" Z  r& V: Y0 r) ?3 H: G
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。) T* L" d5 I7 g2 T# X+ H

- j- ^" ~1 p; `5 K‘proxy|P’(强制为代理)
  P5 G. U, ?1 X此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。+ o0 I& T. {# V2 d0 |& C( i  z  i
注意:要使用这个功能,必须已经启用了mod_proxy模块。
, O& c$ |& [7 o
$ q8 W$ }* G- k‘passthrough|PT’(移交给下一个处理器)/ y, M' s8 R0 o/ k
此标记强制重写引擎将内部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,可以这样:
$ ^8 d1 Z; G- b% H7 wRewriteRule ^/abc(.*) /def$1 [PT]4 E/ L; {+ i4 k' F# }, d' @% Y) _
Alias /def /ghi
3 I1 h' S  H( j1 L  f如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。" N( Q9 X* L6 h  D* v
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
1 i7 B; ~% y) j/ R$ O/ ]0 H# x
" F2 Y8 ?% o1 Z) Z‘qsappend|QSA’(追加查询字符串)
* {3 x7 M  G5 z" l- F0 d) ]此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。# ~( x# z. J. d

  d* G, O' a) @) Z, z‘redirect|R [=code]‘(强制重定向)
: o% X. ~( [( t3 P9 z若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
4 x" }4 V; M2 r0 V9 s4 F* Z注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。6 v: U/ t8 U) i5 |

# \4 O  U& I- o’skip|S=num’(跳过后继规则)
* N0 W1 J' }1 Z. F2 @( h此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!7 x) E- \  J$ B4 [* ~6 \
, p9 O- Z6 U# D
‘type|T=MIME-type’(强制MIME类型)
5 u8 B2 y0 V: r8 q. B2 X强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
7 k# U# E. y' c+ G% I6 `8 ~RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]1 M4 n* {2 \4 f: B+ z0 w  p


4 H2 C4 U+ z5 ?! A) x

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


+ K: J0 b# C' v7 S+ y

一、防盗链功能
( B4 T+ r" x; X* b  q

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

  1. 8 l& Y. `, h* s4 o
  2. RewriteEngine On
    - w/ [4 C$ g- @  a6 W

  3. 2 T/ |! Q3 l6 v" T1 c; Y
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]7 `1 c9 g& A- G4 D) {1 W( m. V

  5. : X9 x) M, h) o8 R7 g3 v* F
  6. RewriteCond %{HTTP_REFERER} !^$  A, B# s& u1 }( c
  7. ) f! S2 @: _: x' e
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]* I- p! _2 U: P: x
复制代码

2 [( e# p- Y4 p$ g! ^( i+ ]0 X" }" o3 h1 h2 u" E
. |- q5 ~* d$ {, ~) U$ d) b

( q# ~/ U9 @, V8 \

( ?3 N) ?0 a4 [6 o' N
& k4 K6 Y+ k$ A. \

逐行讲解一下:


5 c  G8 W6 V5 b) _

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

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

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

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


0 S% L; ^: M$ P$ _

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

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


& A& u% k4 ]# b" t" v6 ~

RewriteCond下:

[NC] 不分字母大小写

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


& d- p& U0 F/ e; Z9 d: |+ X/ H

RewriteRule下:

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

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

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

- ^. p& R) W% {$ l6 k+ a

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm+ i- O: C1 L" e7 B7 Y# E: v

二、网址规范化

[size=1em][size=1em][size=1em]
  1. : H3 C) m6 V# p" E+ ]6 a3 V( ?2 Z) w
  2. Options +FollowSymLinks
    1 I  w: r! u7 {# V4 G6 |8 F, v0 y

  3. : F9 S2 Q7 `+ v( p. L; Q
  4. rewriteEngine on
    * N' l( z, _- D% y/ a) ]4 K

  5. + B2 M6 h" G% H9 o% m
  6. rewriteCond %{http_host} ^yourdomain.com [NC]. ?; D/ a. u; s/ T6 p' E2 [. N3 F

  7. ( s, o; e2 V! ?" d* `+ p
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]. G- y0 S- G4 l" S3 i  ]% [4 j
复制代码

2 x& r9 x- m: o# f  o, y& V0 l. o; [5 ^) M' P
$ r* Y7 R' `( ?* n0 R- u3 y
4 m% q6 o" O. Y0 [7 i  q
. N8 q+ i/ i- A7 c
, O3 g7 B; e. `6 o3 c1 J0 V) K

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

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


! l* l; ^) a4 W) K

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

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

  1. & k* v6 d5 T: l1 y& Z5 X
  2. RewriteEngine On$ U$ Y# l2 w0 U: w7 {) [" E

  3. 4 k# f+ n! w0 ~; l) h2 d7 i
  4. RewriteBase /
    ; A+ k+ n; M$ F/ g8 @1 N

  5. . K% Q4 v% T3 H
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    ( \, [! B* w4 F5 Z
  7. 4 e5 M1 l8 }$ w7 I3 w
  8. RewriteRule ^ http://abc.com/ [R=301,L]! M" i, p4 O" [! Z1 N
复制代码

/ j+ n* Q, C+ q, f! m* y) B/ b
+ T2 _* C+ i  L  A4 w3 r" {
$ s$ y* f: z0 k4 S6 U
3 P3 U' k  I6 _) n* w- Y
0 V7 E, l8 ^$ F( t" t2 ]

3 W/ \" P6 _" u4 t5 Z/ S+ i) l

1.打开Rewrite功能。

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

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

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


2 [, K- x( y* p5 x

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


) _- Z4 `9 @, ?2 {4 f

三、临时错误页面

- c6 y+ U( D7 r5 f8 c4 P

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

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

[size=1em][size=1em][size=1em]
  1. $ r7 ~( _# {* r3 x5 o
  2. RewriteEngine on
    / Q, o* Y& M% r7 B. W
  3. 8 i5 C7 B2 D% d0 X
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    : B7 O# {1 h" ?/ y

  5. 8 H1 q0 T) W# P! u9 x; W
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    ! R- Q4 f9 M8 l  P

  7. / O2 R2 X1 T3 ]5 |* V1 H7 B
  8. RewriteRule $ /error.html [R=302,L]3 d1 G: J9 @3 E6 M8 y& B
复制代码

) S8 \- R* @( m* L# x" k
. a* d8 j/ L! `0 p

6 e! c5 o5 J4 R
9 {. U# b1 [* h9 s0 p! K# X
8 ^" ]% j3 W8 X# p0 Q9 I5 f$ x6 z
" T6 `. `: q( i# l) ?% g

1.继续打开Rewrite功能。

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

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

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

$ p3 f! ~4 I) ]- B8 M- B

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

6 y& X' C" Y$ Q% j0 `3 H

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

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

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

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


9 B% _" G9 O2 F( j" V# w9 Z1 b

^ 表示正则的开始

$ 表示正则的结束


" s+ p+ m0 Y. c: t, V' P5 u

四、重定向RSS地址到Feedburner

, f3 |$ m" w; Z2 S4 Q2 u: \

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

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

  1. % c% p1 Q% f: t% v
  2. RewriteEngine on2 Z) [! }2 I/ U8 |
  3. ! @. Z9 U& b1 k1 K, m3 u4 D
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]- D2 r$ y9 |/ B  i

  5. 0 X- q( o+ Z( g% M( X7 L
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    . [+ A& y) ^& C5 t# Q* E0 _

  7. 7 K9 }/ r: ^, D; i
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    1 P0 Z. l+ L4 G+ s- r
复制代码
+ r5 F* N( }# z/ r* P
4 n( m' Q& H+ ^  L0 t) Q+ q) W
- |9 S5 P7 [' c; r0 T; Q
. A. u2 @* m; F  o0 o/ y
, ]# _- v& l7 S. S) f

, }1 U, ?9 Q9 [, [

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

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

8 X2 f! R0 f/ R, m

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

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

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


2 R' w. z5 \. T" y8 u# [, ?" N9 d9 m9 j! _7 B8 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 16:00 , Processed in 0.077221 second(s), 20 queries .

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