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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
2 h0 I# S0 W  w4 `% e( J0 `
, D7 ]6 i7 P# y9 j) I. `) H, U

[size=1em][size=1em]
  1. 7 Y- d( v" Z: a# v+ [  M
  2. RewriteEngine On
    8 E8 B: ~; k7 u9 e) Q" T
  3. * N4 n1 {% s9 g/ H0 G
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$1 R  ~1 z9 s8 f; W/ ?6 y
  5. 7 @4 a* z% s1 |) x) D
  6. RewriteCond %{REQUEST_URI} !^/blog/
    0 l' ]4 k! F4 D/ U7 T9 n
  7. # g. s% V5 G2 t, F. y! n
  8. RewriteCond %{REQUEST_FILENAME} !-f# }7 H' Q, u& r! ]" Z1 q9 @4 _2 `

  9. 4 w+ A* t! L( r5 S
  10. RewriteCond %{REQUEST_FILENAME} !-d
      N- A4 G6 Y9 X/ I3 ?

  11. . d  h* s; F8 s5 d5 h
  12. RewriteRule ^(.*)$ /blog/$1
    ' [* e+ i# @2 ]4 \, l: V! E
  13. 0 v8 b5 ^! R4 p/ J
  14. # 没有输入文件名的默认到到首页
    4 F' }7 f- j: W$ f9 {

  15. 6 x* A, }6 t1 T$ W: X
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    % |# K9 f% x! y) \

  17. * t' ~; c) D+ _$ p7 z& B
  18. RewriteRule ^(/)?$ blog/index.php [L], q3 [9 E, Z/ i1 Y: f% a6 X
复制代码

2 D) H' I9 D$ _0 l* f
% x5 j) e, [+ T4 H9 r! U9 z
2 w# a. n8 l' L$ p* V" n7 L5 s0 I

4 i! F' A. h% P7 i: [: Y
# M% a7 P7 b% t) z5 C" n, t5 M

/ t% M8 q; b" A; p/ d" E1 L6 C6 i

下面我开始解说一下上面的意思:
4 B0 n* A& B: J8 o$ c( N
9 W3 ~% Q4 r7 B【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
$ ]- U/ K) K" [9 E
2 x0 o! x5 p& {  x4 R3 X; M* v6 j4 G【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】/ j$ w5 x  Z+ x* O2 w( e- H
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
' C8 I" U. X3 s/ F, D2 y( i" M- t9 s2 e) n
【RewriteCond %{REQUEST_URI} !^/blog/】
. n' j2 R; S! Y. @% u$ C也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
% p6 j- p  C5 o6 p/ \
1 c1 I* |* v8 }; c* F- t( p, x" ^" U: D【RewriteCond %{REQUEST_FILENAME} !-f】
6 Q  u( i' I6 V8 ^2 m【RewriteCond %{REQUEST_FILENAME} !-d】) F  `4 }5 J* H! P) M) I
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径7 n9 I2 q& L9 A+ t
1 I, \; S6 b. I1 I: W: l- Q
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
( g# T- q+ _7 X% Y; P
% B+ Q; f0 D* M% u1 v' \【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
4 X  m/ K2 M$ E1 z* g3 z! y【RewriteRule ^(/)?$ blog/index.php [L]】
" [& L5 n7 D! O: S$ h这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。( I0 H3 s& z: x  D

8 m+ [( s, Z% A现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
) i9 b( C# O0 n9 E答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:' d/ K1 t% }9 u9 G
RewiteBase /
4 D. Q6 O7 F6 y' z2 ^
1 v- ~5 T) t1 I还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
, o9 Q2 s. V% f1 o6 W至此,完整的语句应该是:
2 Q/ s! \# T1 O$ c4 Z5 V: n2 J; e8 e& I) d5 h0 Y

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

  1. / M- @+ e" |$ c
  2. ####start####. k+ n  V0 b  x

  3. ( U! u- f; y, _5 e8 ?! c
  4. RewriteEngine On
    ( ~" t3 \8 W" t- Y: F4 Q
  5. 1 }# j# I% a1 @9 _( E5 q
  6. RewiteBase /- ]: y; z1 @, t1 f* ^) p9 x/ {

  7.   a7 H* Q0 k1 V. E) E2 W3 z
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    % k, H3 @0 r/ h" m1 D( N+ F6 R

  9. $ \6 C0 N  N* p- _2 ?
  10. RewriteCond %{REQUEST_URI} !^/blog/
    7 t) @( D& x6 O4 @+ \# f

  11. . b; c) x( ]- v: L' I/ ^& y* M
  12. RewriteCond %{REQUEST_FILENAME} !-f* J2 |6 H2 f! H2 i0 N' g

  13. 0 I6 z) r8 j( G4 A8 y
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ; e3 A2 {* ~' j- q2 E- g

  15. 6 g. R) z  e1 X% B
  16. RewriteRule ^(.*)$ blog/$1
    : c8 t: J, K7 b( C2 y) h

  17. / m" R/ ]. f5 j* M9 d% t! Z
  18. # 没有输入文件名的默认到到首页
    0 q* f# J% Q' H4 Y9 p1 U
  19. : t. ]7 b1 r, B, _. |
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    6 j; q7 X& o4 ?4 `

  21.   Q# U) ?. f: J: I' c' \( W) i
  22. RewriteRule ^(/)?$ blog/index.php [L]
    2 M6 T% p0 ?" J+ O; Q0 M
  23. * @. r, Q- I! l. Q- j! g7 C
  24. ####end####
    , g) C# e" L/ W# p  ~1 J+ k
复制代码
9 r' K; Q1 t6 B' M& q8 u

& s+ [6 R$ T. F7 p0 p
: }& f1 [/ B1 U8 ~2 B
' L, C5 P6 W0 C% O. N. v0 L
  n( R! o2 W( b# s! n6 n
9 W7 b! x  e$ D1 O& r! O; K9 _

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
2 T$ r& P* p  `* v8 L' ]$ E# m! e! a  m6 r  _6 }
防盗链的语句,同样需要添加RewiteBase /,如下:
  M/ [- W) b6 _5 f) X; r2 o) V
( I6 r* Y$ i& v1 }8 I0 R3 y8 {

[size=1em][size=1em]
  1. ; U* C; ^/ }5 P
  2. RewriteEngine on+ G6 N3 X- ^6 N+ s

  3. & L9 y' d' K* B: Q( f/ d' n
  4. RewiteBase /
    ) c0 T/ u# C/ l9 f# L+ y

  5. 2 W* m# f1 ?' b8 \9 l
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]0 Z6 B1 u+ G0 S. v7 W0 m
  7. 8 E* E+ I  I! s4 K
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    % M) u2 A2 p3 K& y

  9. ) c3 F  ~9 c" Q
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    9 S6 J6 C" `) e+ _+ H
复制代码
! }: `+ m! K6 j  G1 w# X3 I
+ Y& e/ n7 V1 o. t% O

, }7 d/ p5 q* @# }  R
1 c3 d/ z: R" h

: u1 I- e9 @- T
! O* ?3 A/ Z# e: X. Z0 v

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
7 n- C0 _+ M# t( y. v9 x
0 k6 U% {" z1 I/ }下面附上简单的语法规则和flags:1 R% B: x* u% K4 K4 G: Y4 E
【RewriteCond语法:】
* P6 f2 x, l7 Z- q& tRewriteCond TestString CondPattern [flags]
3 q& D/ X. c2 `8 H% _6 drewritecond的其他用法:5 `: z; O9 D8 {2 E% h
‘-d’(目录)% m  d5 u+ }' m& R
将TestString视为一个路径名并测试它是否为一个存在的目录。$ h- q( L0 C; V: m$ s
‘-f’(常规文件)$ {; C; N. I8 z6 d* d
将TestString视为一个路径名并测试它是否为一个存在的常规文件。6 c7 p! W! d$ h  @! |9 n3 ~9 k2 p
‘-s’(非空的常规文件)
4 [5 s) ]7 j& e" Q将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。7 ]) N' q1 u" \, g3 W8 G
‘-l’(符号连接)
  J; A$ @3 ~  }1 ^! `/ _将TestString视为一个路径名并测试它是否为一个存在的符号连接。6 L  j! X0 Z6 g2 S* F9 W* K! s
‘-x’(可执行)6 W  `) _% a1 e; n& S
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
, _8 t7 \" l' j+ H‘-F’(对子请求存在的文件)
- f- M/ }, m" R! ~/ f: k检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
+ J. w% U' r& W# N; ^& j‘-U’(对子请求存在的URL)
3 _8 Y8 ]; Q5 y. @检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
$ K/ q/ g# B; m4 A" @7 E: {4 Y* d* u) v; `
【RewriteRule语法:】
3 E* `8 C6 l1 N% v& ?* H! ?6 ^9 VRewriteRule Pattern Substitution [flags]
! V% j; O& G1 _( y. ~; P
3 Y& m" y) Q# i, e- q/ v& [【flags】:# Y7 {+ y! D5 _$ d3 P/ ?
, L; v) w1 ^( T& {0 D8 f& X
‘chain|C’(链接下一规则)6 E3 q- S; e' z& \
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。/ W  l& x- K2 C6 w+ I' q

2 c/ u1 m  S' t3 U2 _( b  R‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
: o& ]8 v2 G5 N% _3 p6 N7 F0 P在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
) Q8 b/ b0 Z. F+ |$ A- ^( v* V0 ]) x, z5 L2 f! d, K! O4 V
‘env|E=VAR:VAL’(设置环境变量)
, U7 W1 V  e+ U; C4 o此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。$ Q' v4 d8 i$ w% y) A: G. o% G5 f& v

* _* G/ T1 W( o+ ^7 H+ q( ?‘forbidden|F’(强制禁止URL)
$ v) [3 h( k3 l! A" p% m强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。1 q  @' I( j- w1 `* h( L

0 h; J+ k! p. B& `* o‘gone|G’(强制废弃URL)
8 d0 O$ \. r6 K强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。+ ]% D2 k" W2 ^( ]2 W9 U% H
8 M. z; p  k& z. T
‘handler|H=Content-handler’(强制指定内容处理器)) u/ r& W) ~7 m6 X3 ^& u2 w
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。) L) I- a+ r; J& b: M- @' H

% T( E1 u0 }( n$ K‘last|L’(结尾规则)
! G* w3 f: Z# N: r( E& n4 x立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。6 d2 D# }/ |* z& o+ v* ?$ d2 O5 J
& s' c9 X; I' D$ \8 m6 g# o
‘next|N’(从头再来)  j" A- }; D' G$ y6 D
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
" u. j( m) M1 _5 }2 i2 P( t
8 p: E* C5 k6 d5 m; D‘nocase|NC’(忽略大小写)
/ B% L. `  y( o+ }2 `8 R' \6 o, Y! F它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
8 s, R7 ~- B1 Q7 ~: I2 Z9 v* d, t$ }- z8 q  g' |
‘noescape|NE’(在输出中不对URI进行转义)4 D1 E/ C0 N5 k2 r- v4 R- Y. b5 v
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:2 l2 `3 T3 t: D4 [
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]+ i  [6 }) i3 T' j' ]! e# s4 l
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
2 t3 g/ Z0 D# i5 e; k7 F- x8 A% A, Q2 S
5 x; `" F6 ~0 s5 T- A  h- H" @6 C‘nosubreq|NS’(不对内部子请求进行处理)& M& l  f3 W: ~% B7 e, c
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。6 }& Z' I( n! Z2 x* F% D) j2 d
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
; T$ h' D/ y. R: b5 \1 K8 F; R, b( s: R7 K3 ~
‘proxy|P’(强制为代理)5 G5 f4 Y" M, K8 V' K
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。5 K" p' y: }6 \- D
注意:要使用这个功能,必须已经启用了mod_proxy模块。
. \) v% T0 O+ U# n) o6 u
* O# }1 y% g) W7 z$ r8 C: R+ Z' g‘passthrough|PT’(移交给下一个处理器)
( A; Z" E8 |" i. l7 c此标记强制重写引擎将内部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,可以这样:( Y+ E/ n( K& |7 \( I* [. A( J
RewriteRule ^/abc(.*) /def$1 [PT]
9 P$ k9 j, [- G) Q; l4 IAlias /def /ghi
4 v4 t/ X. K& b. C如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
" k, {' N: d' u6 m- ]  r注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。6 H, A7 U4 e, t7 N
  X9 N( ?- o; O: q! n& O0 x& `
‘qsappend|QSA’(追加查询字符串)" T6 ^4 b' @. c7 F" @# c( r3 a% B0 ?. a
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。: g! ~* Y1 |' b$ T# N6 w
& K# Z3 ~4 _# x
‘redirect|R [=code]‘(强制重定向)
& v; O. }; w# Q& Q' }若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
0 ~& j9 i7 P% K- L注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。1 o9 s# f! ]0 ^* I7 C

- x5 v9 V0 a9 ]3 A’skip|S=num’(跳过后继规则)3 G, G) o0 s$ M# `7 o3 F. M
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
$ k- G. ^6 ]& p) P  V
3 K' o/ l$ a" B9 k‘type|T=MIME-type’(强制MIME类型). f, q) a  Q7 `- ?2 Z0 [- ~( J
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:0 e/ A* S* z) K$ I; J7 r+ m
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]. X) ~+ g4 W" t( b. l! ^


8 L2 T7 X2 H7 `; v/ H2 W0 r! }

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


% s( z5 t( @2 I

一、防盗链功能' E* V3 l4 k/ P# R% v: c' h  w# t

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

  1. 4 @8 n" l/ t) e5 t+ h
  2. RewriteEngine On
    - k% F2 {6 _2 u# r

  3. - _& G0 ^4 x. n
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]' U2 T2 l2 |9 n) c# d) B
  5. - ?, ~7 m) P3 r9 [+ P- s- t
  6. RewriteCond %{HTTP_REFERER} !^$
      C/ `8 L6 I2 q9 x; v

  7.   [6 x9 c. J9 J
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]& c( U2 [9 X* ?: S; s
复制代码

: N  u9 s% o0 i- r: h" E& S; c- O* S5 ]4 _5 D4 h

5 }4 v! l( v* O  G, a$ J& u& Z4 y; c' W, x

# Z/ F4 m- l( Z0 L2 G" }
1 W2 [* L. H5 s6 x0 ~

逐行讲解一下:

. V2 i9 h- `" j* m

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

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

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

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


. c) `- }, {  F) n0 G

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

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

. a4 `; s' V' q

RewriteCond下:

[NC] 不分字母大小写

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


1 E& h0 A& o- D

RewriteRule下:

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

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

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

3 z2 H6 \% q/ n; ?7 O

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
) C7 y* k" g6 ?

二、网址规范化

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

  1. 2 n, H% j) \, X' ]+ Q
  2. Options +FollowSymLinks9 L% N! c7 _" U9 \( I4 I

  3. % R/ D2 W# r) ^0 r2 ?' H: \
  4. rewriteEngine on  I0 g! M0 j/ ]/ k4 \5 R' G

  5. 0 W; L: \7 O5 @) H% I' w
  6. rewriteCond %{http_host} ^yourdomain.com [NC]8 @: J2 L8 Z. u9 B) X  j

  7.   ]- m/ u/ a: b6 y
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]* l) J6 O- h( d) U: b
复制代码

; u' i# z2 K4 P/ b" F9 P0 U8 g7 [% I
8 M- `% U+ ]( [$ D  y

% [7 u+ @; V2 I5 G) ?; |/ i
9 z) N& O+ g  r- q$ H7 R

0 `& s5 t; L% U  X; w) d' M1 d* j3 w

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

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

5 z3 Z! X4 P' h) f

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

[size=1em][size=1em][size=1em]
  1. 3 t% F- ?) M- y5 i8 P+ k$ y4 ^: E$ U
  2. RewriteEngine On/ f$ X, P9 g! J5 i( `

  3. 4 X8 B7 P! M& Z2 V: U; R
  4. RewriteBase /7 D0 P0 b8 H) a
  5. ' ^1 f$ ^' `' Y3 w5 `
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    ) _2 {: Q& D+ C* p, m1 X

  7. ! q8 s& w6 I% z( P/ E4 Z* {, E
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    / N. ]2 }) C  R; d$ u$ R
复制代码
% f. _% u# i  D9 S+ W
# {3 ]( [! x4 H, S- G( \
# K4 m( M  t6 K* N; w6 _
" c4 W+ k" P6 T( q& S6 {! z. q
5 `8 N  m/ Z5 c# I1 b7 }+ U' y0 _

, [* C8 |5 U# I, D' K

1.打开Rewrite功能。

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

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

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

: K  j8 a& T) j+ l

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

& ?; P) r4 Y$ D, r9 C* s

三、临时错误页面


; }; C9 ~% y  }6 Y1 u

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

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

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

  1. 8 a4 s% J: ?9 p* n! e
  2. RewriteEngine on
    9 W, x# j' c+ p: Y) W! w

  3. 2 B2 A8 w$ ?" ^# m
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$4 _( Q3 G6 `1 i) n  j) N

  5. 5 w$ \5 ^6 z6 U. g. c
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    7 n3 n0 L3 u* N0 J
  7. : g. R( u$ F. x* j3 J, {. A
  8. RewriteRule $ /error.html [R=302,L]
    ) d5 R, [$ q9 R- A9 g, m
复制代码

8 w5 B3 r9 v2 l( I
+ Y$ W8 V6 u/ ]9 x( R1 O& O
/ O) S2 o0 \, e9 C/ {7 j
& k# X, \- `! K) @, g% M

) `' g7 K& i: j3 n8 L0 _4 I3 H% {5 u% a- {

1.继续打开Rewrite功能。

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

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

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


* e: g2 B9 }' U: ^: z" [4 ]: t

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


& a. _( K4 \6 X2 z% `; x1 M

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

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

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

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


6 y- _' q" k+ y

^ 表示正则的开始

$ 表示正则的结束


2 n( d' F# E) ~8 |

四、重定向RSS地址到Feedburner

3 {* x: ~1 T; ]* k+ x8 \: B  \

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

[size=1em][size=1em][size=1em]
  1. 8 W' [- [- r* r/ ~# U$ i$ U
  2. RewriteEngine on
      B/ r! [3 W0 G! M& v( C; r# a
  3. 1 K) i+ @" d; G% j4 U8 i# N
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    & g, T  A3 O4 G% ^" `0 [# v# y

  5. 3 u* }: ~9 z6 y& [% n# |2 \7 T
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    % ^* R0 }  g9 u( F: u1 `! Q, V7 [3 t( i

  7. - J, g+ Y8 A$ S; B6 L' f9 z
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]3 d  P( j7 J$ b, Q: `- s
复制代码

/ Z4 u3 @+ u  q( B! o1 L% S: s- H& K, c" h7 r& A3 G. F
: m1 o* D3 q& q" g! E* E

, ]0 n0 H) A/ f8 Z- j$ y4 F# |# A- Y

) \* i1 @: I5 C4 s0 `2 P

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

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


) w4 S% w/ D8 @# i# ~. b

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

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

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


' }- I4 [6 x8 q: A, Q, @+ X; s6 U0 L& o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-18 23:57 , Processed in 0.126186 second(s), 20 queries .

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