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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
* R  M" G  [& O8 E9 Q7 p7 _6 }
8 Q. r* u2 X% [( r

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

  1. 4 p. a( H/ E3 y2 A  i& x
  2. RewriteEngine On2 @1 `% E7 U. ^  [2 v  `9 C0 P

  3. : j7 f! R* K0 }, d7 z
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    $ M/ I2 D0 Y. W& z' X
  5. 4 T$ \' a' X7 v
  6. RewriteCond %{REQUEST_URI} !^/blog/  _1 n1 N" ~4 t- h+ [
  7. ' y$ ^8 D% j  ^4 h* q
  8. RewriteCond %{REQUEST_FILENAME} !-f! g+ O: p$ W9 Q& i

  9. 3 l- A% _' X0 m, ?3 F1 D1 p
  10. RewriteCond %{REQUEST_FILENAME} !-d) j8 [3 r  t6 k+ y" S( T# N

  11. ; _# x. s+ i4 J
  12. RewriteRule ^(.*)$ /blog/$1
    - L; b, b, E3 ^/ t- b! D2 W0 ~6 f  J5 P
  13. ( }$ z1 F$ q8 J- E
  14. # 没有输入文件名的默认到到首页
    ( E1 L) e, z6 \9 {/ K6 G. i
  15. 7 B" B# }! N2 l: @
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$- }' b6 ]+ f* l8 E# s) V* ^1 U
  17. 8 v; f2 q- U$ F, ]
  18. RewriteRule ^(/)?$ blog/index.php [L]
    * q0 F6 J: u6 i# Z" w. s, @
复制代码

1 ^% T- @7 d/ J9 j* i
/ ~; U; E; V- B2 q/ x3 w: I# ?

% z" J: |3 c/ e* B- |7 f. A
1 r) T0 s2 h) y+ e+ w
" _3 H2 D. z( K' z6 z

, W+ U: p, Y9 z+ s  q: [

下面我开始解说一下上面的意思:
" j( ^1 N1 k5 a. x2 y
% k# f4 z8 o! a5 [/ \【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。( U" n& \& h1 O" I% N9 e
% A$ f" X3 p- Z! x, m# M
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
8 U! `8 `9 ~# I  Q7 G# L) T这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
6 {5 C3 S! T1 I. F1 t% D* R0 `
' w0 k( j" z  Z: q【RewriteCond %{REQUEST_URI} !^/blog/】
- Q8 ^. V( \/ K" W也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
' Y& S' j( @) x- x9 o! \9 S2 `  T5 Z- T: j
【RewriteCond %{REQUEST_FILENAME} !-f】0 }7 |( A/ h1 g
【RewriteCond %{REQUEST_FILENAME} !-d】: P3 U) {: r2 H1 \4 {- P
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径; @3 Z+ p8 `5 `  O
* @% ]' O3 V# O6 s0 j
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
* {8 {0 F$ Y' S0 j& g9 q( z( j8 Z- ~
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
- \) f! v1 s- U. X3 o$ x【RewriteRule ^(/)?$ blog/index.php [L]】
# y* j) \. M* y/ ]这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
2 X4 G) P' E8 U
5 Q! ~# Z& ~4 I- J, V  C8 w现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
. N& Q, r6 ]7 P. {答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:; o4 O9 `9 {0 @/ E, x/ d
RewiteBase /$ M1 @4 W  D5 [% K( ]

- g  i) L' @- k, y还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。# e  l! Q" i+ D5 ~
至此,完整的语句应该是:
3 ~. I5 L: G* E" L' x3 ]4 h1 u1 Y7 s2 C

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

  1. . ^& K& V9 l- K) R9 U& z# `" y3 h
  2. ####start####. p" X3 Z5 `2 B. p
  3. 9 E, p: t9 e+ d+ o% r8 J+ U
  4. RewriteEngine On, |( E) ^' n3 E1 t/ f
  5. 2 J; K2 u3 [: \7 |: G
  6. RewiteBase /. b$ P8 g  |7 o  v
  7. # h. J; c1 ?1 I: q  z! B, A
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    * Q2 O3 h) k* ?. U- c; B
  9. ) c" u/ h0 }! P. k% g
  10. RewriteCond %{REQUEST_URI} !^/blog/& J7 O% V; n$ i" K- w
  11. # y- @5 l6 M* n* H0 L7 i9 C& u
  12. RewriteCond %{REQUEST_FILENAME} !-f$ @- F. O  y# z3 e1 s0 K( c: s

  13. 9 k; n- @2 k1 }2 _( c( X
  14. RewriteCond %{REQUEST_FILENAME} !-d5 E( `, k$ H$ ~  \: Z
  15. / G$ e" }7 q4 I; q: d0 k
  16. RewriteRule ^(.*)$ blog/$14 O6 T1 F5 c( k$ }1 B6 S
  17. ( g) |- @4 R! C% I# g) n# W
  18. # 没有输入文件名的默认到到首页
    ! r% U2 Q; W: G2 U; j9 |
  19. 8 M/ o' Q! P: A4 v  X/ p9 V2 T* U
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]5 d7 r7 e! q3 }0 d! h' O5 u
  21. % d% z4 H0 D' v3 ^( a
  22. RewriteRule ^(/)?$ blog/index.php [L]
    - [9 H! A- L) H& H" f  [% _0 X

  23. & T% Y! s8 T! Y: w% \2 j$ w' f
  24. ####end####
    ( e7 F/ q3 {: x) V% }( ?7 B4 G$ Z  U8 v
复制代码
# h8 M( Q+ H) ]0 ]4 K
1 H5 u* s2 Q" r5 p5 i5 E# _

" }" O% j3 J0 R( q& x/ H/ u3 `  }  C8 K5 }) f& t) p
- H) L" L3 c2 ~& W
+ l0 w: Z7 p3 V; l% V% [

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思  L/ j: z; X# }  A  \% Z$ x" {
9 F0 ?, L1 f, o+ H7 l1 g7 k0 o
防盗链的语句,同样需要添加RewiteBase /,如下:, A0 V' x; Q- v

, l: G9 t  b1 K; p8 H

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

  1. 0 K. F+ ^: j8 G2 r  q
  2. RewriteEngine on2 i" A' i% H1 @5 |" U7 {! \1 ]
  3. 5 @8 Y' z, J" @. p
  4. RewiteBase /7 }9 h4 ?! v/ P

  5.   o( R+ d" v/ h7 f/ `  J6 V
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]7 X7 O6 ]4 n9 i$ e: W. B
  7. & {3 v8 K$ P( t* r% c) `9 `
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]8 |( k/ L( W0 `

  9. # H: J+ g+ t8 i; ?
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    % {& |  M/ ^6 Z* X5 j7 e# t- b
复制代码

/ b# P+ n5 i3 S& [) E' d2 a) C3 E% _$ C
- l% h& I# ]% b: M$ b: f6 v( n

* i3 E, Z5 Y% n' q
: F) m3 c* Z' v7 ]
2 m& m/ o, M) U- g6 {' u

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。9 L5 M: p3 M7 O" A# s6 v
! v% D' a9 K. H# P
下面附上简单的语法规则和flags:- C/ t) M# \  Y& l2 B. p) F+ Q
【RewriteCond语法:】( o  C& w' a, x
RewriteCond TestString CondPattern [flags]
  f! ?' [- _! f* Crewritecond的其他用法:
+ j% i" y, O9 {" L0 x‘-d’(目录)  [# D8 ?- F" v
将TestString视为一个路径名并测试它是否为一个存在的目录。
% Q" j) u, l0 u; Z6 Z! v‘-f’(常规文件)
' |8 ^' n, O7 |! _' O/ ]! u将TestString视为一个路径名并测试它是否为一个存在的常规文件。" w& h6 y$ T2 D" y! X
‘-s’(非空的常规文件)1 Z5 C" U- s1 H: x
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。+ p2 o; a3 R% {4 g( X& Q
‘-l’(符号连接)* K" N! w4 x- M( G
将TestString视为一个路径名并测试它是否为一个存在的符号连接。- D4 r5 v0 d5 @1 b5 T3 n5 ~* n; v
‘-x’(可执行)5 |1 p( @$ H# V' ?
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。. N) q" w) }* j+ e1 M5 j0 \
‘-F’(对子请求存在的文件)2 C  G9 Y) v8 I% y; w9 i7 e8 d
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!( ?+ H& P& }, R
‘-U’(对子请求存在的URL)( V9 `, Q2 l3 R& s
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!! q$ D" n- c: I+ k7 S$ H

8 Z. v/ Y" k6 o/ O$ M6 {【RewriteRule语法:】
3 \% x4 M1 ]& p7 u! X, n) S- r6 a& M' m: KRewriteRule Pattern Substitution [flags]: u# F" h1 e2 c
3 f; ^7 _+ F& L( R* \
【flags】:
; q$ m- O  n' V' U6 r$ u0 }$ t
# T* j; v4 A, r9 D! z‘chain|C’(链接下一规则)
2 q  g! [# `& B# ^3 N! O此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。; I' |" Q( F/ e1 D- J# b/ ~
0 P7 V+ d! J5 F) s- m" m3 z
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
6 w- |% w3 h* D4 L# L, {  J8 H在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。! l2 F) B0 y* [2 N7 v

: Z+ Q- Y! s4 c3 L" P- n‘env|E=VAR:VAL’(设置环境变量)
+ e% q* b' P- S此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。( \* o' n, k# x8 o
" j: v' `" |. b: Y# I, e
‘forbidden|F’(强制禁止URL)
9 g6 v" D$ q7 B强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
( @( F2 n' d9 V: E4 D$ X2 }3 y' V5 r" z- x4 ~9 C& G
‘gone|G’(强制废弃URL)
! ~8 j/ y; b' S3 p9 v3 W' {5 K强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
9 D3 q% |, n+ @* D# P- \
+ l  _- @) `9 i‘handler|H=Content-handler’(强制指定内容处理器)
" R; A1 b/ I' B( m+ w. l$ @8 E强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。; ^  }* ^/ w+ ~5 }
3 m! a2 I* o" N3 L5 k" n
‘last|L’(结尾规则)
, |4 }' F( P' W7 M7 s' Z& `立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。- e* x6 Y  r; a7 T: o# p- G

7 F9 j! I  D' `* u9 M‘next|N’(从头再来)
$ D3 ?  U8 b7 C; l) C& V& A7 `重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
! w* ]- o& O* f2 S5 c
( D+ p2 j  E5 R' T7 ?: f& Z‘nocase|NC’(忽略大小写): E* @5 f" D' v
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
- w" `' U, t( z; J4 q. [
/ C- e9 Z- r* m5 e2 t" S. x0 e‘noescape|NE’(在输出中不对URI进行转义)2 o0 T1 W0 S: U5 N3 m9 g" ^8 c
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
: `$ Q, F. U0 N- gRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
" f+ S' n8 ]& s6 |5 x1 c( y( Z可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
5 u' q' e% u, p: j) ^# i0 v6 ?2 k/ r7 R% ]" ]9 Y
‘nosubreq|NS’(不对内部子请求进行处理)
, ?( {/ l" b2 D5 H; @在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。1 ~  M3 C+ X  M8 L* T3 S5 r: W
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。7 ~* Z) I$ S) V0 f" E
. s/ f$ x5 {* E- Q( m$ Z( e
‘proxy|P’(强制为代理)
# q+ q7 i- }# e! Q此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
7 a! ~" B& U+ K) \" R注意:要使用这个功能,必须已经启用了mod_proxy模块。
7 Y, ]1 A2 u( p; W% ?/ P( h' x! G  ^2 g3 g: F! t
‘passthrough|PT’(移交给下一个处理器)
  U& _* J# {2 |2 k; S" n此标记强制重写引擎将内部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,可以这样:5 w; Z/ y( \$ q/ W9 M
RewriteRule ^/abc(.*) /def$1 [PT]2 t  \: n! s2 O. Q7 S, k6 u; V
Alias /def /ghi
8 |' m6 X2 }2 k! r. j* n如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
) E4 b) D$ i& x6 E6 p注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
1 `5 Z" p* G6 j* a4 h' K- k( w- J) _2 {
‘qsappend|QSA’(追加查询字符串)
- ^! C! ?$ w" Q8 R$ e- h/ x0 |$ x此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
5 a7 F/ S# y0 q3 Q1 a( i: N( T$ ^9 \" Z' ~) y* b& L
‘redirect|R [=code]‘(强制重定向)9 ~. H6 J; d+ q$ G$ k
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
/ ?: w- S+ K" p( V2 ?' c注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
) d8 |3 Q  A$ {# z$ d/ p# r- P( k- }, v: ^5 F$ C$ j0 i
’skip|S=num’(跳过后继规则)
8 z% `% c8 `# j* D( n; ^$ G此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
6 q3 r. i. h/ Q" K+ F
$ g+ a3 m" \! }. _; S4 K‘type|T=MIME-type’(强制MIME类型)
$ v3 N% D! \) O$ I强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:  Y8 z/ ^/ A! e$ {
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
1 ]1 |& p$ C9 U$ K! s3 K



5 P. X3 H7 S: N" K+ J5 h5 w, n+ n

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

8 r: v; x" h  d" A1 F' \. U

一、防盗链功能
! |( _  l" j2 X6 d# {- @6 P4 u

[size=1em][size=1em]
  1. $ ~7 X1 `/ \$ m$ S" f* q' Q* [
  2. RewriteEngine On% u8 ]2 j/ C" t; m8 U+ d
  3. 1 F6 f0 i9 M) l! d) a) D7 f" U1 n
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    9 `0 {  e5 e) o  x/ M0 W0 Z
  5. ) }* b/ I; Z" f
  6. RewriteCond %{HTTP_REFERER} !^$9 h9 N; y( Q1 u
  7. : q' Q5 T& }4 U
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]* v3 O; R5 q) O5 g* E& l+ q
复制代码
$ ^/ t$ G  W- Z+ Z
; H) y9 G: b) k3 i( N: d0 J
8 h5 p' h+ }+ u( u: U. S+ j5 L; G, d
4 t. X, d! c: t6 M6 h( c& k
  N. e# `1 y) O8 I
; T: r+ ~, Z6 R! c" m3 h3 R  c4 M

逐行讲解一下:


" `) {6 K  X( V% N5 c2 ?& `+ D* i

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

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

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

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


! e% t, V2 a% N* v- d

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

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

5 M; m" I9 f2 M# j, n

RewriteCond下:

[NC] 不分字母大小写

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

4 Q+ S, X( Z; d8 G

RewriteRule下:

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

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

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


5 z7 t  o$ L8 I9 F: p3 T* z

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm/ @9 l! B% T8 R, E

二、网址规范化

[size=1em][size=1em][size=1em]
  1. ' g4 r9 b0 K/ l* u
  2. Options +FollowSymLinks
    & n! m; g' E# a
  3. 6 e! f% h, b* g7 Q7 o) N) v' p" @
  4. rewriteEngine on
    ! R- ^7 J1 B9 ^0 B: o

  5. * I1 B1 i7 s/ t1 I. h
  6. rewriteCond %{http_host} ^yourdomain.com [NC]+ b; N: `. I' z$ Y1 d* c; }
  7. 1 I& I5 O$ A9 j3 p$ W
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    , p! P0 o4 w- {4 {; M
复制代码
$ P0 ^5 ^8 @7 j4 E7 K
) P! J% }8 z2 j6 D  N7 d' ?6 n" i

% a% A1 y. h8 _3 V
- g9 e& W- F  V. K1 f

7 L- o- g/ o5 X) e# ]! L
4 A/ G; L' [' h% Z; d

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

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


9 [( T5 ?6 ?4 U3 b

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

[size=1em][size=1em][size=1em]
  1. , G- p  h+ `8 g4 q/ O2 W
  2. RewriteEngine On7 I6 y! Q+ v4 L8 [9 a: @

  3. ) t8 I- S) B6 _  b6 H: B! o8 x, Q- Y$ W
  4. RewriteBase /# J9 v. f, p) u/ o* I" O4 s/ I9 [  M
  5. ( V5 v* J) U3 o+ V6 z. E
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)  H; ]+ E. `" `( I0 J& g
  7. " p+ F5 W0 ]1 p$ k# X) h
  8. RewriteRule ^ http://abc.com/ [R=301,L]8 L4 j7 d( Z# k1 z2 J9 W* n
复制代码

# s3 U6 G7 o$ ]7 E; _- T
( I( k! \( Z. G" F9 ~

- f: z+ w( j6 l5 X+ q0 O$ Y
! F/ ~5 N4 [8 x  g2 I9 a. p
  S/ d* K. x2 v8 x; H8 w1 r: _2 M( q% e# ~; w, o) J

1.打开Rewrite功能。

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

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

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


0 ^. `+ ]' E1 `6 g# k

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

% i6 ~0 q% M3 _1 X- ]

三、临时错误页面


1 u. I! }5 H  ?6 Y& ^  v; g5 z

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

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

[size=1em][size=1em][size=1em]
  1.   g9 J8 Q: v. G. W
  2. RewriteEngine on
    : l) H' v  w/ U. W- H* O2 s
  3. 4 t/ G8 \6 q; B6 E0 P& b6 c0 {
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$5 I1 m/ B9 x8 Q9 b. U

  5. ! y/ @$ }7 W' j
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123% h6 B7 R4 }8 f/ _2 n

  7. ' y3 ]8 [  J3 p2 @) K: B
  8. RewriteRule $ /error.html [R=302,L]
    # V' w$ ]. G# e: |6 x; V) D1 `8 U
复制代码
: D, M3 A3 K& Y: y$ R- V1 d9 }3 Z
% o0 Q8 b# T  M/ v/ F8 y* v  F+ q' b

9 g- a5 R  Y- I0 O6 t
. z9 s0 u. @6 l! P: F. X/ S4 b  a9 r$ V

: _' ]* ~  f/ ^- K; |& ~

1.继续打开Rewrite功能。

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

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

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


9 J" \6 M- h. J$ Y- d# g

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

) Z! T4 N( F8 u( G. u  b( z

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

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

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

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

' J' Y" \' N- K* q7 ?1 K1 ~

^ 表示正则的开始

$ 表示正则的结束

) L  Q6 S" |3 {

四、重定向RSS地址到Feedburner

8 L# h) M; U2 Y

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

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

  1. $ H; Z- F$ N+ Q" `& E
  2. RewriteEngine on  T4 y8 Q0 D: I1 K3 G) h- Q
  3. ; Y& [) H( X5 u! ]
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]# i! m6 s+ T0 Q/ x8 [% m
  5. 9 [  C' M  o% a
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]2 \: Q% `0 k+ E' \

  7. ) q. J$ V! S2 V2 ?
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    + v3 o, Z" J9 I' f+ \) Y
复制代码
; P( @3 O* h* X1 O; L- d$ S

. i8 Q/ q" Y$ F) F

! T9 }. N& Q1 y6 m+ ~$ u# F$ f  P( E: v$ t# {
5 M: M& [" N7 P6 M# A- D
6 M( X+ ]3 E8 \4 J5 w0 v4 v

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

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

0 k% _3 r* Q, s/ y9 e3 h2 {

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

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

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

; i0 e& _, ?  W  O" q3 y
2 |6 Q# }/ a2 {' F- e. E. g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 17:24 , Processed in 0.134523 second(s), 19 queries .

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