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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
' y* H8 N  o: X9 _. Y
9 M1 J) d" K1 _; L: M, I

[size=1em][size=1em]
  1. 6 m7 H  b. z/ i
  2. RewriteEngine On7 _' t& W: x- N. e% ]" e; n

  3. ! B" _- _  j+ E1 I* L9 s
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$. |. E' G, y9 |( a
  5. " y3 ?! ]; |$ Y5 C
  6. RewriteCond %{REQUEST_URI} !^/blog/) w% h  K* S. A* t  Z# \& y

  7. % p: F7 k+ u5 F2 ]; a
  8. RewriteCond %{REQUEST_FILENAME} !-f
    : v2 o- f6 h6 |+ K$ K2 @

  9. ) s# K9 Q. L9 N5 E" T9 `
  10. RewriteCond %{REQUEST_FILENAME} !-d
    ! J* x: |9 B+ F5 |) y- z3 R

  11. 4 `; O1 g/ A2 M. W! p+ c, `3 l8 V4 d
  12. RewriteRule ^(.*)$ /blog/$1
    0 \7 @3 Z: P% r% ~
  13. 4 c" \& Y* q4 j0 F$ G) y
  14. # 没有输入文件名的默认到到首页  {) B4 O7 l0 k4 l; I
  15. 9 N6 y3 }% `% Z6 S6 w9 N
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$, N8 ?' H& n; J! b$ I

  17. # T) b+ }: ?4 S& s& ]
  18. RewriteRule ^(/)?$ blog/index.php [L]5 y( Q- i8 B3 W
复制代码
* r1 e) L  ^! x. X4 M! `! g3 x
% [# y# ]' Z+ e

& ~9 ?/ ~# B1 r: x$ a' e! r4 k
1 N( {& B' x4 v7 ]* }+ E& o: O
% O; \) E$ |6 F, t

/ b& f1 n; R. F5 U

下面我开始解说一下上面的意思:; S, Q( w/ m3 u% r8 G; s

" p7 m2 i2 I! r4 r  y. I! H+ q$ n【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。4 A4 n- }& Y( g. w0 Q6 [5 W
- G0 E% y- \8 F; z+ I- S
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
. L' k; |# g! F* k8 c: k) V这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
+ R; s- ^# \0 G" r0 Q4 |
# K% N0 C4 |  z# e- h【RewriteCond %{REQUEST_URI} !^/blog/】
, f4 ?. k6 B: Q! |: B也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
8 E* h% i3 ]8 d% X! w3 H9 p. h7 d
【RewriteCond %{REQUEST_FILENAME} !-f】
  c! M. h- P7 @& N/ n$ c3 T【RewriteCond %{REQUEST_FILENAME} !-d】5 A2 s' |1 i) A6 K3 O
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径5 ]' u  o+ v# q6 x

5 L; L& K$ D0 I3 V8 d( g【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。6 L0 n5 o& c4 [' y/ c' e
* b+ }1 F, Q! L- u: I8 t
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
. ]5 x1 j2 p$ `* T. E; c+ j  x  l【RewriteRule ^(/)?$ blog/index.php [L]】
3 m* T( X+ ~/ w0 e9 `这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。! A. G' N0 @' `( Z( j: ~
+ t5 v$ c0 @* T: o2 A) x/ n
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。  ?7 I5 i, Z( @8 A/ \6 u7 R: H6 d
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:, Y2 n2 B+ {. c: N7 U0 z5 f
RewiteBase /
4 f/ A5 z$ S; Y0 i: H
- U, c5 @0 H# j3 `: j! d. A0 t" {还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。" I: C2 Y5 S: s) F0 B
至此,完整的语句应该是:
5 M2 _. k6 P4 T# u. g/ [
- s: J7 X; A% `3 h1 Q* B: C

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

  1. 0 B! N$ ~3 u! e3 l
  2. ####start####
    - h8 Y) }5 p3 p

  3.   v$ r) z6 L  ^. @6 s/ A
  4. RewriteEngine On* W2 `5 G) r. m5 e1 T) p
  5. : M* J4 n& `* \/ v, l
  6. RewiteBase /
    * K5 H6 }- B! G1 O+ ?, V& ~

  7. $ ^2 B. q0 L5 c' \' T# l- W. i
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    + w( e# e# v+ C9 j  ?7 a

  9. $ b6 r* b$ n2 O% Z- U
  10. RewriteCond %{REQUEST_URI} !^/blog/
    ' J- C8 N/ W, y- Y

  11. # l6 C/ r" I8 @( [- h$ M
  12. RewriteCond %{REQUEST_FILENAME} !-f
    $ [8 V" S" }+ U& v6 T9 K5 V5 K) i

  13. % R4 o9 V8 u; `3 e
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ! u/ p7 x9 e! k( z8 v3 d% l
  15. 5 T9 `2 U9 G& E  o" z; {3 X5 F( {
  16. RewriteRule ^(.*)$ blog/$16 D; B4 A) l7 i  F6 V0 N4 W

  17. ( a6 p/ Q: q" c1 s* c
  18. # 没有输入文件名的默认到到首页
    . Y! G5 p: U" J# \& d) K

  19. ' }9 d: {' Q# I0 j+ z* m, h
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    ( V+ M& |1 \: v2 }. ?
  21. - n* w/ V7 m* n" g
  22. RewriteRule ^(/)?$ blog/index.php [L]
    & [( v# n# m7 ?* ]

  23. - D0 C* r' S( P' R* n. ^* J) ]0 L
  24. ####end####; K  O. \$ h4 L' X
复制代码

  B( l. z7 E1 E+ [: d' p3 a3 m7 W: f/ }2 O( n
( N; c& b2 P/ x( B9 U
' r9 v& j. a! n* q2 B# P% c# t

$ Q( g6 q3 Z4 G; @. W1 c. T
* E  @& H1 @: h+ c- W

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思6 I0 @  @, W# ~* w1 [

9 ]6 |# m0 |" v% I2 s防盗链的语句,同样需要添加RewiteBase /,如下:1 ]2 e* I! R( ?& S) d: }
/ ^6 f. `) j" m

[size=1em][size=1em]
  1. * b5 X. t' a8 @
  2. RewriteEngine on
    - u4 p, c4 [! t  R: w
  3. " X  g, ]" O' s+ E
  4. RewiteBase /' ?9 t7 ^5 d& `7 P: z
  5. 0 y# o& S4 ~9 u0 @! T  q
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]3 i2 [7 P; I. y# r! [. X8 x$ m
  7. + o( ]0 c- X. D  X& L
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    ) X/ m1 w% v% @/ t8 E
  9. : O9 t% O2 r, B8 r
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    % H- l# X2 F% n6 R7 k; ?/ E
复制代码

+ O5 o) H1 |7 d' c8 g- _4 t. H; i! ~" U1 y; h
% }9 i9 ?- V$ Q  W( E# ~
! m% X6 F5 Z% U8 Z' t2 g

$ a/ t# H& G3 S5 ]$ z6 k  m
' @. @& \2 z  `6 K

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。: T3 c5 o/ N9 r
$ r, }8 P- o8 k/ b/ I: ?1 D1 w/ |3 s9 H
下面附上简单的语法规则和flags:: e; b: f2 l3 T
【RewriteCond语法:】
/ |, T0 z: h1 }8 f9 L. GRewriteCond TestString CondPattern [flags]
0 m* o: \; _3 r) `* d5 g. B' Prewritecond的其他用法:: x9 B7 K3 }! R+ P) C3 w: h
‘-d’(目录)5 _) {# e( C7 G5 a( Y5 h
将TestString视为一个路径名并测试它是否为一个存在的目录。$ Q6 Y0 G: P2 J' C+ a) L# w5 D
‘-f’(常规文件)8 c$ N% ]" Z. C
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
( o( n1 I: g% W% X# D‘-s’(非空的常规文件)
: ?, I1 X1 U2 E% M将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。0 ?- X5 B2 X. l7 v9 F4 ?! J
‘-l’(符号连接)6 ?( X9 i$ e" y6 b1 m; W6 k
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
4 E: S# }  }. i: |, ~‘-x’(可执行)8 j$ `3 _2 y! w! Y
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
1 s. c" ^* k9 {2 W. @# Z: P, p( V‘-F’(对子请求存在的文件)9 E: |2 A) Y( i: x* Q& Z# ]
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!& z5 \: g' L. [, I3 _& B2 s
‘-U’(对子请求存在的URL)
- @0 f4 q) L2 i7 s# l" w检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!- Q0 V/ S* E7 w! ]
% U' j, n- U$ R
【RewriteRule语法:】
& ~' c9 |! a# W: o% O4 ~$ Z( eRewriteRule Pattern Substitution [flags]
# A: _0 C( S- V) l$ K8 \3 C
+ G2 \9 Z9 [% A/ M【flags】:
9 _/ r( p+ C- B$ b3 N+ C
3 s7 f2 z7 f6 P1 k‘chain|C’(链接下一规则)  E4 A4 T$ _9 [6 s, o9 c" J* z
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。, Y; _  N& @8 N4 L4 f) ]

9 f8 w* Y! s$ r‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)$ D( y# M* w# o( M: f+ b
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。# ]$ T% g) f$ _" F7 ~4 B

" U5 P' C6 M) f  g" }# F‘env|E=VAR:VAL’(设置环境变量)6 Z5 g( X; _& c3 r, z7 c, C
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。# g/ I& ^+ P1 p' G: O. q. R

8 m% `1 t# w3 S& b‘forbidden|F’(强制禁止URL); D3 g9 {/ z! ^" W& J- L
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。$ Q5 x3 j! w- [+ @; t

2 a) ~. c5 \+ {( s" x, K. Q‘gone|G’(强制废弃URL)4 c1 _8 p) d1 Q+ H' i8 r
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
- O$ f# s- O! R4 V2 O* i5 b0 n% s: Q* ]0 l5 _: ?
‘handler|H=Content-handler’(强制指定内容处理器)
5 ^: P+ T5 [2 Y6 x8 o强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
& t- M6 O/ U1 e; m& O6 v8 @1 l4 C; g7 p; B: t( c; x5 [' }
‘last|L’(结尾规则)
0 Y. A: ]1 s9 ^+ ^$ P) d立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
" O5 z  v7 ]3 ^1 [4 i
7 A' n' J8 v, x. U: M$ d‘next|N’(从头再来)
" T% d; a+ `. z$ G( s重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
" e& q+ j3 }- I4 p% ]& C7 S# ]  m% S* U
‘nocase|NC’(忽略大小写)0 }* J, C. X' {( |8 m
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。- x1 Q/ j: j5 s# U, ?$ |' I

" O0 l4 H8 x" O( y2 A‘noescape|NE’(在输出中不对URI进行转义)- |" A# K$ H% `/ Y6 j, f# q, o) f
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:+ i8 y( d1 E9 u9 k' E
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]* t/ r# ~2 ]9 T, e, v
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。' Z( B/ [1 s7 Z9 i# D- J6 v

8 w0 T( P  \. }  S. K" b: A2 d‘nosubreq|NS’(不对内部子请求进行处理): @% v4 s5 H3 m5 a- x9 o
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
* R5 r7 K( ]9 ]使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
2 V" @1 C. \8 {) I$ ~% M: b
3 R  q( g) h% M$ Q/ g" d8 D! ?4 u‘proxy|P’(强制为代理)
% Y- ^) Z( ~' [" Z/ o7 t9 Q& L此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
/ m" f0 V2 I8 V/ ?注意:要使用这个功能,必须已经启用了mod_proxy模块。( ~: o5 {; y+ X9 _

: R1 |# g; v( W‘passthrough|PT’(移交给下一个处理器)
4 |6 a$ ~2 c" v& e此标记强制重写引擎将内部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,可以这样:4 q* ]6 U5 I# e" S  S6 L
RewriteRule ^/abc(.*) /def$1 [PT]4 O  g# N* x1 }5 t$ r- b7 E6 N
Alias /def /ghi
7 B1 z2 o1 C5 W2 M% I* u) [! _5 R如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。, P& b/ X8 e9 i1 T. P( e, E
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。4 }, t9 d% j# j) X8 R
4 t- ?- F9 l8 S5 l3 x
‘qsappend|QSA’(追加查询字符串)9 T$ q, ^4 `" z1 `, s9 ~
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。. I* E; z0 z7 G5 C8 R
" ?5 M+ S  o9 S: K' `
‘redirect|R [=code]‘(强制重定向)+ o  n% @( Y+ i# |  p  I
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
' S1 n+ w# ?! e) R8 f/ G! L注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
; w" }3 J! j) M! y' S/ E" J3 q
6 D4 k( g- F' ?. U, S0 m/ P9 s' h’skip|S=num’(跳过后继规则)
" v9 E% a" A+ p, ~/ i此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
% x) d, b# M' {+ l
0 ]" b; a& |4 v" t& O/ Z‘type|T=MIME-type’(强制MIME类型)6 s& A. W+ u2 y  t
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
  G9 o1 Y, r' O9 w  H. Z' ?& BRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]; l4 `: a0 v  ?4 H7 j( \



% m% E7 ?2 m" p: Z+ X0 v

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


/ g! S' @% }$ ?0 s

一、防盗链功能
4 W; z  A7 n+ d9 w6 q0 \# m9 X

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

  1. 2 i  S+ k+ V4 X& y1 a! i
  2. RewriteEngine On+ d0 k5 Q0 Q; X
  3. 0 K( A1 m, D/ g! |; r& L8 F( R8 [
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC], _( \6 R6 [4 v, L

  5. + F( h3 B- ~) y
  6. RewriteCond %{HTTP_REFERER} !^$9 s. i/ }( g* ~# s, N

  7. 7 t* y$ G. B9 t# M' _6 C6 |
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    + |/ ]1 K2 o& O, t* t# r
复制代码
) [% l! l! [" S. j$ n  F, Q
4 v4 |5 O6 l2 A) p" B+ ?
8 j: _! d/ }& i4 w8 H4 I
$ U* p  a5 a2 g& X0 ]

- Z  F  i! Z2 F

' w  D9 w, I% P5 b9 f

逐行讲解一下:

' f1 R" E# n+ R

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

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

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

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

; Q2 T. l0 s3 q# L( U5 T7 J

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

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


" H0 O" q6 m7 o3 R! B! I9 M

RewriteCond下:

[NC] 不分字母大小写

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


+ e& q: u; i( e. O/ p; e4 b+ W

RewriteRule下:

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

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

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


2 m- C# k7 l' B/ r9 T

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm+ V' G2 P5 [5 t8 S

二、网址规范化

[size=1em][size=1em][size=1em]
  1. # g, C  R  E0 f3 Q
  2. Options +FollowSymLinks
    , h" _0 U$ H2 Q2 [
  3. 9 D4 [- t( O& u. ^9 Z" J
  4. rewriteEngine on- o( ^6 B1 X$ _' L  O7 c. p

  5. 9 S& @/ Z; a; Y/ W: P
  6. rewriteCond %{http_host} ^yourdomain.com [NC]. q/ m/ s: t) e7 }; k( S# y% A5 Y
  7. 1 n2 A6 b; H" p( W0 k. z
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]- K$ {& c7 T  Z. e
复制代码

, _+ q, x6 c( E+ N5 i7 L/ }- Z6 V' E
- I+ E/ S: M% w0 q- r# a8 j6 F; I, V
% u$ M7 |( q( Q8 W" O
. Z& j3 D% S0 i) Z& r4 @, Y
5 @( [' d% O* I" E+ J

" N8 E( p& I" N8 `

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

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

, k* J1 J, b; G8 h, l0 j* S. A( O

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

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

  1. " i* N  g9 z5 A8 Y
  2. RewriteEngine On
    " V6 H9 n# @7 X

  3. 7 H$ W2 U/ z9 T$ w  Q
  4. RewriteBase /
    / x6 |$ k& Q, i& k) h

  5. , @* b  v9 F5 o" i7 i
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    ! @8 g# V) M" @! c

  7. 1 D2 W0 |7 b/ v+ E
  8. RewriteRule ^ http://abc.com/ [R=301,L]: c6 J; J" L& p
复制代码
/ a! U" b' s/ p1 ], ^( w

  H+ Z7 O; n* x' x0 F7 S
/ B8 T( z- d" ]8 N0 y+ M0 y; w4 [
: k8 E: O, a5 D( b

+ G' e8 s( I9 o$ x; k5 h5 U) e' B# v) A4 p

1.打开Rewrite功能。

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

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

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

' A2 q! w5 Z7 m4 j

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


  Y/ T$ ]7 c6 D% G, h

三、临时错误页面

9 ^' Q, b% F9 |! x

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

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

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

  1. - H5 @" [. `6 H  n% O' t: x" b9 L
  2. RewriteEngine on) F% l2 w) z' D+ x' w& A
  3. / X9 @/ D2 s, I. p
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    / Z6 n* \1 W; f2 ^- x
  5. / Y, M" z' I5 V2 v9 k5 a
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    3 ^" E7 X' n& A5 y- }: m* j
  7. 2 E, D, E: ^5 c; g# `- t3 X
  8. RewriteRule $ /error.html [R=302,L]& ~7 }. g- |4 Y) @& q
复制代码
9 x9 A1 i3 d& e. s8 `

, z% a# ?5 r( k& q0 J

! ~1 O4 l8 l+ L3 r; `# I& t3 b+ M
) Q4 O' Q* f* f* Z

( P8 |1 E6 U. y' \# [

1.继续打开Rewrite功能。

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

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

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

( U2 ?1 M$ _$ ~* \. H2 }

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


3 Z' X, h7 Y4 u6 M8 G) Z

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

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

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

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


. T1 Q* `1 ], y

^ 表示正则的开始

$ 表示正则的结束

! _, I3 g/ V5 }4 N: X; l! _# H

四、重定向RSS地址到Feedburner


+ J/ U* v8 U2 T6 z/ H4 z

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

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

  1. ( K+ |; n* z4 d/ L
  2. RewriteEngine on& V: F+ K" [6 W4 n

  3. 5 ]& q+ U' k  @/ j4 D
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]; c; q; d1 Q* |, q2 z. H

  5. ; B0 ]7 h$ |7 }" X# e
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    " d" V1 _* Z! V, S1 u% o
  7. , ?$ Y& t2 G* e" e3 l4 e
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    ' E0 A$ N0 J2 r2 V( j! T6 u
复制代码

: v8 W  n$ ^$ m) {  L& }
- W4 Z- U9 s- {% A3 k
/ k6 \% F+ ]: t4 n

$ e3 j9 {& z, ~' V8 j; c$ X5 l1 U1 F- |& I* V! j
# j- N/ y# L+ m0 ^: @) [6 C

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

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

, R9 L  D6 Q# B( O) C

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

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

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

8 G- S- M# o3 l/ M: G
+ \( |) I! S! m% s, d1 c0 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-3 03:46 , Processed in 0.128394 second(s), 19 queries .

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