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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:; w% [5 d) ^7 S# `( J
3 L, I2 i! x( L+ M- H- |/ a- }9 f

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

  1. ! V) ]0 S/ y! i! w7 I5 m
  2. RewriteEngine On
    . h# `7 r1 B: \; I
  3. ) |* C8 M! h/ P0 p6 Y% Y/ k
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$7 _  Z* r5 C( C+ J# R3 E  n
  5. ! l% u% a1 m! W" M, z
  6. RewriteCond %{REQUEST_URI} !^/blog/
    : c9 F1 J! P6 F$ `

  7. % _, a+ s: E# M0 Y4 ~+ u" G+ e# ?
  8. RewriteCond %{REQUEST_FILENAME} !-f2 l2 i: [0 s! M* J$ |
  9. " v% g) A$ d4 O
  10. RewriteCond %{REQUEST_FILENAME} !-d" @- h/ T. E  W% ?" y1 H" Z  w

  11. 3 d6 c0 l3 e- a& \# f# s
  12. RewriteRule ^(.*)$ /blog/$1" K  O6 L4 G7 ?4 j; F, U
  13. 9 B3 z9 \; e9 y" v  b8 J
  14. # 没有输入文件名的默认到到首页
    $ C: c9 O$ `/ u2 C' z. V

  15. " ~, G3 ]9 I+ G. H& \. O5 |
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    3 |& H- }' U5 Q2 L, Y7 k$ |
  17. / M" U9 l* ~6 @. E) L: z  c4 U1 k
  18. RewriteRule ^(/)?$ blog/index.php [L]' K! ~. @% R' g0 Z. t
复制代码
- d7 w: }8 V7 o; V! Q. z+ ~

$ @5 o4 r+ O% U+ M
8 B! n" m; f, Z. @
; k! u" O% v/ ^! A
- A; F& A5 H" j1 j

2 \) t  Q6 q5 W+ S0 Z

下面我开始解说一下上面的意思:3 S7 K5 D& q. T: \6 w' q
! H2 q0 s7 r* m6 a
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。6 L9 v, ^, X5 V+ F

- m' ^; p7 \5 }3 M! ]: G【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
2 |0 _, k: y0 _- i* m* n' p5 H" ?这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。% B, Q+ |7 {. K

2 R" h5 e. M$ ?* V8 |' N; L2 b【RewriteCond %{REQUEST_URI} !^/blog/】0 Q" g) m% a$ H: L4 W) s: o# \
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
6 @" |' ~% X" Q/ w2 ]
9 c; o7 R: A5 v( Q7 o6 F! |2 Q【RewriteCond %{REQUEST_FILENAME} !-f】1 L9 ^8 s7 O' Q; n0 Z# A( X+ E- q
【RewriteCond %{REQUEST_FILENAME} !-d】
4 V' y# A2 c% V) ~这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径. H, \. H3 ]& y
2 d" i* `  i' @* `) M, c9 U. n& E
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
3 p8 g0 M* v) Q1 T% [" W( n  d+ F, T: P
& Z: Y. e4 h% s【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】% z/ [  a' e" M" o0 l) Y1 J$ j6 o4 p
【RewriteRule ^(/)?$ blog/index.php [L]】# }  w: g: Z1 i0 [4 b3 B
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。9 M' R$ b8 d; M% X0 f0 Z- b

% i4 M9 N1 c7 C现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。) C9 A% j8 Q3 w8 V3 x5 N1 n
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
( v  ^: |% P! _$ N, lRewiteBase /& \& ~/ M1 k9 |3 |- |

4 ?4 \- J% O$ C& q1 g, D还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
6 h# c  p, {3 _) o& r" I$ x至此,完整的语句应该是:
3 _+ ^! s" L7 h) R- f  |5 R2 M; k+ Y# C4 j

[size=1em][size=1em]
  1. 8 M$ `7 z; m; f
  2. ####start####
    4 t4 G4 u, d, O7 ~
  3. & O- F3 ]! K6 l- K& D& U- ~2 W' @
  4. RewriteEngine On
    + ]5 U4 P9 d( A7 d8 a
  5. ) V& G$ H$ z$ Q( G; ]% _9 E9 B
  6. RewiteBase // `( G  E' _6 G* T0 k
  7. 5 n9 J' H" V. h* _2 Y+ U
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]7 C5 P' f4 `. a0 n+ s, C1 y

  9. . F8 j; Z; i' ~% e, f8 c+ y2 c
  10. RewriteCond %{REQUEST_URI} !^/blog/3 _" C9 d. Z2 Q, Q
  11. * l8 R3 I. t' N+ Z; k3 d0 E" Q
  12. RewriteCond %{REQUEST_FILENAME} !-f6 x+ s2 k2 v  F: M

  13.   @6 w" Y; X/ n2 [5 G7 l" d
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ! ~$ S8 g' U3 D8 A

  15. 8 B5 v) i' J- n2 P; }
  16. RewriteRule ^(.*)$ blog/$1
    . B) W2 f5 f% P5 r% u4 B- l8 O
  17. . {" w- I8 J  l  t; v- K" `+ A
  18. # 没有输入文件名的默认到到首页
    % g1 ^( M/ d2 m
  19. 6 v3 r* ]/ x) M; L
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    - B6 v" X, ]( m7 m7 N
  21. 2 `9 ^  Y& ?. ~
  22. RewriteRule ^(/)?$ blog/index.php [L]
    . }4 r, g0 c+ H$ n( V' V
  23. ; z! V; `1 U" j( Z8 W8 s
  24. ####end####
    7 |" O+ ]% Z. X( ~6 v) X3 s- \: w
复制代码
! _2 y- O- u/ D; W; h

& Q* H) U2 y9 r$ J0 z5 t5 W# y! C& g
6 }# ~  l" o) w# @8 @
/ z) Q9 t7 R. f' {* @
0 k" Q- p% A+ f2 Y

/ N4 b# x# f3 Q% r

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
0 l6 k, R* @5 ~8 A) f( }. G
5 A8 R4 N$ R9 F) M% X防盗链的语句,同样需要添加RewiteBase /,如下:9 b- W$ y- ^) h+ I) }

4 W5 Q" D' G9 k9 i

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

  1. & b) T9 ^2 w4 P7 x5 z
  2. RewriteEngine on0 Z1 d. ]; o3 \* y9 t# W* x! r# p

  3. 8 \- s1 ?, l! ~1 ^; C
  4. RewiteBase /
    9 n) T8 a" Q8 k) P# M6 ?: n' r  ]
  5. ' b7 Y4 H7 ^# V! I
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]- o- }& E/ }4 j6 Z
  7. 6 X" F$ C8 l. o
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    3 y+ M( I& p* v. X8 d8 O
  9. 7 y2 c5 Q, B5 E  W
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]8 l3 j* x, ?$ o
复制代码

8 I4 V* I3 U. Q7 h; z4 l) X8 `- c2 j( H( x  A) R& G
$ j" A9 ^  m8 Y$ y# d, J' N3 A
: f/ v8 @  A1 n" q$ ]* j9 ?: ~! G
# i; |1 e; O, P9 `

+ V4 B3 }# |0 |0 H2 L

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
) b) ^1 B0 i* v& A
8 a) \: e6 G8 H, }6 N: N下面附上简单的语法规则和flags:$ q, {4 b& a: @7 ^; e
【RewriteCond语法:】  e, t7 O# @; A- I' z9 i$ I
RewriteCond TestString CondPattern [flags]! @. J- i4 }. V8 ~
rewritecond的其他用法:
1 W  g% b5 L& D7 ?/ P/ h‘-d’(目录)+ _9 d# g" l/ C2 c2 b' l2 X
将TestString视为一个路径名并测试它是否为一个存在的目录。9 R$ C; d2 N. E0 ?% r/ X$ a
‘-f’(常规文件)
9 j6 Z% F& A6 o) y1 G将TestString视为一个路径名并测试它是否为一个存在的常规文件。
/ N6 W9 n- n" K, H& S, S# R( ^‘-s’(非空的常规文件)% T* L) o4 R( b
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。8 P) s) X1 z: ]& p& m
‘-l’(符号连接)
& H% H1 U& b0 z. z$ i$ V9 x; Y将TestString视为一个路径名并测试它是否为一个存在的符号连接。# T7 Q: _: b& z) R, F
‘-x’(可执行)
0 L5 E. _$ `+ o+ J; F将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。+ J  S. I3 F' \9 u" b
‘-F’(对子请求存在的文件)
2 ]) e$ o4 x$ g检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
; B$ r3 @1 r: J8 p% w‘-U’(对子请求存在的URL)4 i! {- z3 b# o
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
" c3 J) W/ g9 J5 u" Y  X  S$ l# _7 T4 [6 U) z  q, c
【RewriteRule语法:】- T& v" _& n0 b, U
RewriteRule Pattern Substitution [flags]
! u7 H' r) Y: U% f  |* y4 B! m+ ]. [8 ]2 ~$ U9 E
【flags】:0 L# N; Q# N3 C3 l
, F8 b6 J8 j! t( H
‘chain|C’(链接下一规则)) E, Z8 E* t* B) K/ c
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
1 K& _. ?1 `+ j0 x* M8 j: b  t) w5 o! _& b+ ~
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
9 t2 I9 ~7 T. ^5 a! I在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。8 }' f4 i+ O, ^, V* H' ~' o- C8 y
. W8 ]' l& g% y7 Z9 @4 D, f
‘env|E=VAR:VAL’(设置环境变量)
1 q+ q; Y2 `0 x此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。! |  F# U* G7 K2 F$ Q

% Z. T" L- Q" L; @' s6 u‘forbidden|F’(强制禁止URL)
* y4 z1 l* V  U9 l- c强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
2 I% d! P9 h. e/ P  v! I0 ~4 p4 @; l8 N+ _
‘gone|G’(强制废弃URL)
& S' }! Q8 r) W强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。8 ~& W0 y- v( ^. y+ U  i
: Z+ T- g$ G4 O( O- Z" g
‘handler|H=Content-handler’(强制指定内容处理器)
( b( {  X. \+ L( ]: P强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。9 a% }4 S; I2 i1 s& e
" T3 d& W4 [8 x# G# M, B# u
‘last|L’(结尾规则)# P  S& f& F3 I; j
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。& u% x; o2 a2 o: C/ K
: _! s* X7 `! ~% c/ L% f% V4 [
‘next|N’(从头再来)7 [7 F# p/ b7 W* z2 _1 c7 o9 U$ \) j
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!1 G  D# h$ {! i
" N5 d) `; o. N- l( X* P1 A, t  _% o- h
‘nocase|NC’(忽略大小写), Y' |4 M: ]* i6 v9 z
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
& N( l( P5 {' K) O6 ~9 a/ A$ h9 }; F/ Z- ]" n- {
‘noescape|NE’(在输出中不对URI进行转义)
; \6 x$ j' y, o) G3 e0 r此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
5 W1 ^+ ]# T; D# y  vRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
$ o" x0 @6 Q/ e可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。1 J9 o; w; g( F9 k8 B( h) c
3 H: G% S9 c' z! T
‘nosubreq|NS’(不对内部子请求进行处理)
; \  \6 l* b2 Q* {在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。# G( r& P6 N% X+ I$ ]
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。- X, s( a6 c& z) H3 r3 F

+ C* H5 T  [; o6 E9 C$ B0 d- I# q. l0 P‘proxy|P’(强制为代理)
# M( i: A: X9 ^: d$ T此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。5 l" `# Y: |$ s. Q
注意:要使用这个功能,必须已经启用了mod_proxy模块。
( T* _" h  g9 G; E1 F* \- {6 L, T- R" h
‘passthrough|PT’(移交给下一个处理器)2 j9 g& X9 A& ?
此标记强制重写引擎将内部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,可以这样:
9 l4 N6 N3 e. M3 r9 _: Y8 KRewriteRule ^/abc(.*) /def$1 [PT]
" B; |# ]/ G  T- d; f( eAlias /def /ghi) \: R$ D; Q+ C2 Y" L3 x1 |+ m
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
5 R& i' U/ ^% y% D( O7 N; U% D+ S5 B注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
* D$ O2 j9 I! K/ @+ j* I8 h2 q' K& v9 Z+ @  E+ B
‘qsappend|QSA’(追加查询字符串)% m" L2 ~: a) {+ @
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
" ~  l) e# P1 [. R% ]
' k  [0 s2 J, _4 s+ u9 e‘redirect|R [=code]‘(强制重定向)( o' y/ C, J! U* S0 f$ ~7 N6 I
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
# T8 S- L# j" g2 g注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。3 K6 a5 T5 ?$ ^2 P: x  O/ _% X

' q; F5 W( z% a" R; U: b’skip|S=num’(跳过后继规则)
4 t7 w" R' f7 [# A此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
2 T2 y7 s6 A- p2 u8 @+ K
6 y# h$ i& A) V‘type|T=MIME-type’(强制MIME类型)
% g5 S# m. @. Q) P& I强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
! f; g! \. P5 E. IRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]; M! W: ~5 {' P: C6 f1 J



4 h8 \6 {& I+ G4 c7 k

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


; Z) b! Z  N$ ]% [/ j) r

一、防盗链功能
- M' y! m4 f8 f7 W$ Y& _

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

  1. 6 {, B: E+ N! f/ t" o& a
  2. RewriteEngine On
    % P" \' W& |; P- {

  3. 6 R) g  A& W- Q# g* A7 S6 x. y
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    " o$ u. E, K1 e9 r7 r; @- N% U( h
  5. # f3 Q: L: \* x% r9 o
  6. RewriteCond %{HTTP_REFERER} !^$
    2 ~0 P& y, c8 m6 M# J' |

  7. # g6 Q& H9 L) A) Z% x; e4 U% b) Z) d
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    " p/ |- X; D" @7 Y3 |2 |
复制代码
3 R6 {/ i* ^1 @& k
4 R& `2 s% ?9 _% \- S
/ q) s$ V7 S. O9 E

, L- |! Y+ c  Q3 `, C

4 n# R8 S9 c  o( t, h3 v

( o4 O7 N/ s" {6 x" J( Q: |

逐行讲解一下:


: F, r+ G! ^# S3 H, }

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

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

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

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


; Y! L+ U# ^( `! ]9 k7 K

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

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


: W7 ], M! E# D/ x' u% Y- A

RewriteCond下:

[NC] 不分字母大小写

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

, A7 u: T8 q' Q* `  R* l( A

RewriteRule下:

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

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

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

6 F8 `0 I! a$ k' @6 R, ^

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm: ~1 I2 C& A: W6 d9 u

二、网址规范化

[size=1em][size=1em][size=1em]
  1. ) ^2 c, c& i1 S  l3 p" }
  2. Options +FollowSymLinks% p7 c3 Y1 {1 }1 y4 m2 s

  3. 4 \* ~  f* I5 m- J/ ?' Z
  4. rewriteEngine on
    % o: ?1 `7 t! p1 ?! v0 D% n0 Q6 Z

  5. 4 G0 [2 }1 i7 }; @# e
  6. rewriteCond %{http_host} ^yourdomain.com [NC]; U' k/ g9 N) B# d# ~

  7. / B! R3 N/ w  o0 z$ g0 X
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    7 k; Z& A2 s( J$ s) @2 R6 |
复制代码

' ]& A8 w) |: L3 @' S  N6 E4 \
0 F' T% f* S& T6 l' D6 h- S# }) t

& P  y0 O1 R  V
/ g. ^8 h5 G( o  `+ c" H
* x" n& c$ P* `5 g- z: y) x
8 K+ X! N8 R9 x5 O

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

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

3 T! ~% s0 {6 Z- f4 I& y3 V, ]* [5 W

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

[size=1em][size=1em][size=1em]
  1. ' h) l$ {- `! Q% ?% r+ G
  2. RewriteEngine On
    4 r% ?) J5 ?5 m/ E* C. V
  3. 3 Q3 C* J4 o* x2 u/ _( y3 y" F$ S
  4. RewriteBase /
    : `+ X# D0 A$ Q

  5. ) y) z: r& H! x7 t7 l+ V( o
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    9 Z: ^( z! d/ H

  7. 5 b4 d$ ~% B0 S9 Q$ ^" M7 l
  8. RewriteRule ^ http://abc.com/ [R=301,L]9 Z5 K' ?9 s, t/ S3 m# T7 b
复制代码
  G3 T( F& g) l

/ y! F: B5 E/ v! A% q  B3 z9 [2 A

& W  ?; ^6 z* Y1 d: L" |( z' o3 z9 e' b% |2 |' M+ E" Q

+ \8 L( D- e2 L6 U" L; [3 J7 j# {* O! J6 q7 |# U9 O

1.打开Rewrite功能。

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

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

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


# t% U" m4 [9 k* H0 j) [$ t* K

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


/ G* H0 u' @& @

三、临时错误页面


) X' B  V" o( ^

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

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

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

  1. / r$ d- F  Y& _# r# {0 t( Q
  2. RewriteEngine on
    . Z" D! z* ?& X3 ~5 M9 S. N' ^
  3. 7 u! D6 D) k% O' |1 `' b
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$; X  e+ P* I- T0 m5 ]$ F5 ^1 y

  5. ; x& U# E; }5 S* d- t* L# e7 p
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.1234 g3 }& Y! X/ }/ F1 h

  7.   e/ l+ g' i2 m2 K! v" k) D9 N/ X
  8. RewriteRule $ /error.html [R=302,L]$ z& r: N$ y* E6 i; @7 O
复制代码

1 m9 V$ H/ @- ~3 Q$ n/ o8 A# O! Z+ g% i4 l1 O+ H
) |- B. h3 V6 |* a0 h9 }

2 y9 f, ^5 @* ?$ O- B* ~5 F9 c, J" P
' S" T. m! k' g
% N0 ?" W" L/ E0 K- M' P

1.继续打开Rewrite功能。

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

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

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


8 V7 I1 T1 K/ H" j! W/ U# U" @

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

3 u0 ^9 N% X, e$ u8 z& ~# D

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

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

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

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

7 d& a7 H6 q( ]9 N( i+ @, c

^ 表示正则的开始

$ 表示正则的结束


, W5 F: p) {1 a& T  o

四、重定向RSS地址到Feedburner


0 ?1 S+ l: f8 ^' `# i& v9 T

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

[size=1em][size=1em][size=1em]
  1. 2 [  J0 {9 X2 ]  ?' ?
  2. RewriteEngine on# {& G& ]1 h9 k' B  z" ~
  3. 4 n( Z. I+ v/ r. n% \
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]& C4 C0 D4 g( S& K9 K, W

  5. 8 q  |% j4 f2 O& m
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]9 z7 c9 j0 A/ ?, G  b) O; C
  7. ' ?  |7 b" }! J) d
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    ) \# V/ C) q0 ?0 K  O, D" g! u" V' n
复制代码
: [, a9 A- b: v. @8 W. u
9 U3 D4 x2 x* M, |! [# ?/ ]0 e+ R/ v7 k
: N" [: Z! d* E: a+ s

. S* r0 Y; u' f. v" M$ Y( ^; N. ^
# P/ }: M1 A" p  t- F+ Z* j; E9 S5 @- r

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

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


  _3 D$ {( }  M

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

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

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

; A4 ?. z2 a& u/ |0 F

9 m; s% d1 ~/ R, n; E0 X! ^* a& V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 21:47 , Processed in 0.062065 second(s), 20 queries .

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