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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
" f9 ~. a$ A5 I' X5 x
6 s) r1 a; N2 s& M5 p

[size=1em][size=1em]
  1. , _3 U% \' Z( }* e
  2. RewriteEngine On  K: h' F2 n4 K/ z; T) \# b; q; E

  3. , `  o6 }2 R' X) q$ z
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    8 O7 V5 v. g' @% c0 R/ o

  5. 4 w- j3 P# N. u% q' @; r$ A% F
  6. RewriteCond %{REQUEST_URI} !^/blog/
    2 L6 y( f1 R, G' u

  7. 8 p4 f0 n7 K* h) k5 e
  8. RewriteCond %{REQUEST_FILENAME} !-f
    ) x/ _) C/ R( N: C. ~2 ~" s% [/ _

  9. . D7 i' u8 s: ?- y: c
  10. RewriteCond %{REQUEST_FILENAME} !-d" P0 D( F+ o) P5 R; w& a6 V
  11. , W/ _1 k+ ?! S7 F
  12. RewriteRule ^(.*)$ /blog/$1% s7 t' U. ~) N* q3 h
  13. / \3 @+ P9 h0 F9 y' j! y
  14. # 没有输入文件名的默认到到首页
    6 h& I9 A' n' ^8 \) k! Q- }
  15. , z+ p( r/ G, h; X8 t
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    6 [& g, r' m& Q: i( D

  17. ! z. q) q& ]: C* q! T0 `& Y6 {! A
  18. RewriteRule ^(/)?$ blog/index.php [L]8 A1 \8 G2 L/ W3 G, J* c. [2 [
复制代码

* M. F$ y! H" |  K! k+ U
2 v0 e4 s" g! x  `0 P
/ Q) R2 g( F, |/ v
% p, i! o  i$ }: i/ x
' C! L4 z  t" b. F

* @8 @6 l' y# a% ~

下面我开始解说一下上面的意思:
9 _' m* g) U8 Z4 n/ T
, B6 W* @* B, X7 j/ M【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。4 z: r! D+ a  a5 H! X/ |) s

- U, p1 X! k: `$ w' \【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】: z4 ^% z2 D: y0 v3 X
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。2 ~( y  ~" C$ O5 G3 o# b$ V
1 z+ f# p2 F+ U; h# c' W
【RewriteCond %{REQUEST_URI} !^/blog/】
2 x7 j/ K# s) M7 l0 w4 m也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
* s: H4 K9 O: D4 m; U( n; u  N' J
' X% u' ^! y# A! D3 U  C6 I( n【RewriteCond %{REQUEST_FILENAME} !-f】
( w* d0 @+ ]" G- x; M4 }【RewriteCond %{REQUEST_FILENAME} !-d】+ E$ \! u% Q. X6 S( ~7 o4 `% ]. H
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
; H% u8 P' d4 {& |; C) j( l" L: D+ M7 v4 M1 w
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。# s% ^! V! a1 l* [! I, l

( P4 G# P, ]5 F5 u/ M7 |# Q【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
1 Z. D0 U3 b; [2 r/ i$ v【RewriteRule ^(/)?$ blog/index.php [L]】- C7 L- i# R! `5 Y6 Z& X* B& L3 T
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
8 g6 G( a* S# v3 ?  }: \3 t. O) b% K, G
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
) N8 Q1 ]6 X3 f- H& z/ b6 G3 e/ P答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:$ O' K& \* d& t4 R. r
RewiteBase /' X% B, \/ v1 Y% {: d  M$ S

! w) \& E3 z) f) e1 c, q$ [( X* S还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
  x0 V: l1 H4 w) V6 D! L% w2 r至此,完整的语句应该是:
8 Y6 w& J4 d  u- a" o; P% f+ x6 z: F! L9 f2 B/ s; {" d4 K

[size=1em][size=1em]
  1. 1 A2 |- Z" b* v* B$ \
  2. ####start####
    ) _5 P. F7 ~) |+ _, v
  3. ! K4 J1 |3 ~2 M. z
  4. RewriteEngine On+ G. t; c! x+ T! l* _) q. g# I
  5. + t& m+ V% ?: `4 P# P( A
  6. RewiteBase /6 r! p. z3 A+ F0 b3 k8 q

  7. 0 Y  \2 h" H7 E7 P, Q
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]. S; h+ I( w; Y! B* E

  9. 2 A- |; p' W  i# `4 [
  10. RewriteCond %{REQUEST_URI} !^/blog/7 ~4 B7 V! X  Q1 W# @0 Y/ ^0 @
  11. ) @* Y2 n% w/ W6 |
  12. RewriteCond %{REQUEST_FILENAME} !-f
    : ]$ G" @, |2 u) b: W

  13. 7 r% N1 X+ I- A* X
  14. RewriteCond %{REQUEST_FILENAME} !-d1 U, j0 r0 X& |0 M

  15. 1 j! x( b; P/ u( @1 |/ E, ~# r/ H7 W
  16. RewriteRule ^(.*)$ blog/$1+ m; _  |- _' _2 a5 M4 Z8 M0 Z5 {

  17. - H6 n/ v& K8 H  a
  18. # 没有输入文件名的默认到到首页' ~: y6 K: C, Y% a

  19. - p- e: V7 k4 D. R. W' V
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    / H5 w. e6 u' P! Y. A

  21. 9 Y. f8 d. G* D) K1 M  p
  22. RewriteRule ^(/)?$ blog/index.php [L]/ k, v7 R( s6 h& j+ i6 o- n4 ]

  23. # |( x4 O, m; x; Y' N0 K! [; d
  24. ####end####
      V2 A" i# P. z
复制代码

4 v& b4 A1 M/ [) d
/ L8 w( q1 F; b4 ?; e# ~# x
6 N, F2 V$ S: n4 ?
  b4 [' d2 c* R0 @' A$ A. b

- c/ G9 W+ n  r

- t: S# U( @6 A; E8 F

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思! K" U0 y2 y" m& l+ U7 o% _1 t
6 _. q9 v( Y; b$ I* s$ T
防盗链的语句,同样需要添加RewiteBase /,如下:
# N& x8 d2 o" Y5 j5 \" B
3 F( }5 U. j& q; O8 r7 G1 s

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

  1. 3 L. d. }+ C5 V3 _& b" F$ W( Y4 f
  2. RewriteEngine on
    - d8 n; \2 C' Z
  3. 8 U% K4 r% f$ n" I) n7 b5 n
  4. RewiteBase /2 ^5 e2 w# E) q: P0 @
  5. ) Y7 P- d4 e$ m5 I. M
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
      S: E% ^* h7 G0 d4 \! z6 m

  7. / @; a8 p3 g! |; y* X2 V0 q6 M
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]$ P* o/ G5 T2 p* B

  9. 4 f% N2 A, D) l
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    : o3 N- Y+ n" }4 ~( M3 z6 v" ?, u: }! C
复制代码

5 U/ }5 J; K* O& }" r6 a0 A) q7 R4 P* a

5 k) |' f6 n+ N$ D
& n3 @$ W1 W* q3 O5 [- J; Q
4 G# K' r' |" ]1 \  w3 @5 i

! `7 B2 R9 v. y, y# p8 `: K

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
- T1 R0 d: J" `/ ?. o; L) s& y& x3 t2 C# ^' @' T1 J% ]
下面附上简单的语法规则和flags:
0 o; C3 r% N, V! P& C  Y8 S2 m+ C【RewriteCond语法:】9 O) `: h0 i6 i
RewriteCond TestString CondPattern [flags]$ q/ Y5 H! U3 I) z; R( R
rewritecond的其他用法:
* N6 x' x2 ^8 t/ }3 x‘-d’(目录)9 \; v) F# c4 }4 z1 D% w7 B
将TestString视为一个路径名并测试它是否为一个存在的目录。
4 T# l+ M1 r9 P% R‘-f’(常规文件)9 Q5 w/ \/ E" w5 ]
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
& d. R( q4 v& @/ f‘-s’(非空的常规文件)- ?- R, l; A3 a4 g- Z* C' U
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。$ d# u0 i6 ^( k' b+ q/ @, d
‘-l’(符号连接)
5 a+ |! a$ [* G% W6 m3 D" v将TestString视为一个路径名并测试它是否为一个存在的符号连接。$ A! c/ F. o0 v: }; \5 }
‘-x’(可执行)
. n8 ~' Q& q# @- k将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。: o  L( s  I% z9 J+ b
‘-F’(对子请求存在的文件)# q- R& u2 u) I. r* n
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!, `$ ]) P9 E  B9 n5 z% o6 ~' ^
‘-U’(对子请求存在的URL)
; c4 _# z) V) j0 d* e) {1 D检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!; G* p+ h+ j% g

1 O5 A/ O: g$ U【RewriteRule语法:】4 [# }. d' E0 H9 C% j% I. P/ M
RewriteRule Pattern Substitution [flags]
* v6 u) [& l! a: C, l7 ?% ~  t2 Y" K& K2 M3 [* F
【flags】:
. t4 J, ^2 p) A9 x7 s
, w& u% Z" ~( M! D‘chain|C’(链接下一规则)3 j$ {1 L3 g7 n) [" H0 o. m
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。  r- g5 \3 x6 }

. ?8 p3 @3 U! E; q( u; U5 {‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
5 @& E, X  @$ X, @6 M, I! N+ W  G# J在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
* G* Y% N( K3 m/ Z. y. e6 \
; Q3 w* S/ z4 T' X- x‘env|E=VAR:VAL’(设置环境变量)
! `8 h9 Y9 z9 N" C- R) {此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。$ ?1 b/ Y' Y9 o  K

) p( K: V, f! w; ]8 {; U‘forbidden|F’(强制禁止URL)+ x5 I1 H9 p& c& P5 O
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
  v! X  L6 V3 i/ ?  {8 @0 M& V+ ^. n2 q  t1 q& m4 z8 B
‘gone|G’(强制废弃URL)
4 S& W* k, T: e4 R7 d强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。) I3 ]4 D* {. I: O7 f' @- I6 y
+ E2 n, r% Q6 A7 [9 |) O
‘handler|H=Content-handler’(强制指定内容处理器); l" A2 T0 q4 G$ v2 y
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。  a; p# z, t* i. @. Y1 o0 n

6 s: G+ O1 L( k‘last|L’(结尾规则)6 u! Y6 ?: j# o2 Q
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。: P) Q/ l/ s+ a/ D* E6 o  M9 b

1 ^4 V2 E# F( r2 v‘next|N’(从头再来)
. B3 v8 y1 \! ?重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
$ @' n. ]4 e/ T7 H, D3 Y- ?% k
2 e4 K& b3 j6 {# }* a3 P& `‘nocase|NC’(忽略大小写)
, e6 X+ k! O5 |- y+ z$ \它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
7 t( v3 T/ a8 S4 @
3 |: V# U7 Z% c. M‘noescape|NE’(在输出中不对URI进行转义)
( h4 a* a6 ^# n7 u" S. L此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:  T/ }, X: s3 L% O
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
* r# t3 X5 O7 i9 {: u. r, s) t. S可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。9 `0 `! K9 b8 l; H4 k/ g
1 v. z- ^2 e4 o: U: b# `
‘nosubreq|NS’(不对内部子请求进行处理), x- u! v/ P) m* N
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。8 e- U) B+ V' ^+ h; v
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
; y+ t2 I. T7 @2 x0 _- v; U
6 Q4 A1 ^) t1 s# M‘proxy|P’(强制为代理)
! r$ m2 Q+ R, a+ g/ r8 j此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
  V% z# G( N2 E7 L注意:要使用这个功能,必须已经启用了mod_proxy模块。; m" D$ r3 S, `; O2 _: n

! b" h' B9 Q! {1 {% p‘passthrough|PT’(移交给下一个处理器)
/ u' g& Y( p7 d: ^8 F6 v5 @此标记强制重写引擎将内部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,可以这样:
( r1 v* W* \5 E( ~: A$ L: ?RewriteRule ^/abc(.*) /def$1 [PT]# G* E) }& a7 ~. y
Alias /def /ghi
& y3 U5 B: w0 C+ n: u( Q如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。9 r( c9 [/ a8 j! i2 M
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。6 [( E* |. s& C& |7 I7 M6 h  `
; E  p4 F8 G' ]! I
‘qsappend|QSA’(追加查询字符串)
2 m& d! L/ w$ b* \5 S4 j9 @此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。* p6 n7 G' C% J4 T. Z3 b: I+ b

9 h* e0 c. R8 w" z( X" z) [‘redirect|R [=code]‘(强制重定向)  r8 }$ L" y" Q) G* R3 m
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
5 V' @& g$ e; n3 y2 u/ U) V4 n注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。; e& V1 z- x# T2 S) l* L/ {" o& f
# l- N# f7 e1 k3 p# y( L
’skip|S=num’(跳过后继规则)
' Q! G1 n" x: p8 q. v4 y此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!) e( {* @4 v# v8 R" }" q
8 T$ m% e& r9 {! @3 ^
‘type|T=MIME-type’(强制MIME类型), W8 Y( R# [4 y
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
3 N" Y2 ~7 z# i+ e6 B7 wRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
0 z) K: G. `# ]5 O3 F! ]5 W& U8 Q



& f. s5 n1 z- ~! i9 i; V# T

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

+ |% d1 \& B" k

一、防盗链功能1 g! B& b: _* r  B. d& p, {

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

  1. : Y" F. v) y2 S6 f# E% \; k
  2. RewriteEngine On
    ' T6 f: a0 z  ?" P* n
  3. / @6 v1 {' v3 o# o% X$ Y# x% g
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    3 `$ S3 z  s( }: s/ ]
  5. 3 g4 I- @. ]1 o! h& v1 _2 L1 p
  6. RewriteCond %{HTTP_REFERER} !^$/ ?% m2 e5 o. X; v8 J
  7. * m7 C, \; h- H* u% E
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    8 y! `: U& p  T
复制代码

$ Y' X  M  [5 T; B2 D* [3 s7 v6 w- D/ d) V0 T- z8 C0 j3 E$ y

3 E; G( p+ g. \7 i9 T( M+ f5 Y7 @  ]$ |, v

& Z- k( L1 q0 ]& ~$ o3 g
- r" C" u! Q- K. B: r

逐行讲解一下:


/ L+ J$ _0 s; R2 q

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

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

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

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


8 `/ d; C" A' X. j: N. f

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

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

/ @1 D6 A& P$ h( ~

RewriteCond下:

[NC] 不分字母大小写

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


  c. o% m( D3 D1 V6 i

RewriteRule下:

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

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

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

: v. h) N: O) d8 c

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm  a* E1 V- j' u/ D$ Z# S9 u. \

二、网址规范化

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

  1. + o: e% ~% F5 k3 {
  2. Options +FollowSymLinks$ V" _8 [1 D8 ^. ?
  3. ! ^3 S" X1 `. _( q
  4. rewriteEngine on1 F5 A2 `' k' N7 w  b0 E
  5. * z& c6 k: l3 ~* b9 W
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    * h+ A% t2 i8 X& a& v& `5 e

  7. 7 E- _! k& W4 C$ C( I
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    1 S. j& e8 k6 G1 L) o# I% c
复制代码
; @1 b8 N4 a5 v2 o7 N4 D' F  {) y

: J- K3 E  C( V

4 L4 i$ E$ ?2 y- M$ z& V
+ i; B$ @/ Y4 Q! \( {1 Z9 h- D8 }3 [
3 E0 t8 l/ m* w

) W7 F# |+ J' k$ M' a9 k* K2 y

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

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

* a* I# k( }6 m4 b7 z

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

[size=1em][size=1em][size=1em]
  1. % r: T5 B0 U2 n) C" `% R
  2. RewriteEngine On
    3 G, y$ N! n/ P  b, v% J
  3. 8 `8 V- v# o$ i
  4. RewriteBase /
    ( p- {7 e# q- o5 c
  5. 7 C/ Q4 R# ?3 d6 |$ X( s( F
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)  Z  W! `' z0 |7 R  i( h1 t! J: r3 a

  7. # {; m( v3 P+ X0 `: Q
  8. RewriteRule ^ http://abc.com/ [R=301,L]: t0 Q6 Z$ F* U% V# v' @
复制代码

2 W  i' p7 D# ?8 s7 }1 j  R8 b5 |
8 @! u; e2 _$ R$ E

: t  [; M5 O5 m& A( P* J* d4 w4 L+ S! J! g2 W0 F+ u  E

* x1 @1 D1 a1 P' l
2 y# X4 n& ?4 Z6 O

1.打开Rewrite功能。

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

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

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


1 x, a0 _. M- l

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


6 E: B* {2 x/ `# a3 B$ o% ?5 U* z

三、临时错误页面

# t0 z0 @) f. y( S' y- q

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

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

[size=1em][size=1em][size=1em]
  1. * X0 C" y5 O. b) |6 Q7 i
  2. RewriteEngine on6 v  g( s/ O6 H4 k3 ~% a8 {. r+ I
  3. . `6 u2 b& X/ l2 o/ [8 Z0 W4 d$ j: E
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    4 M2 P7 V7 l' D' R* K6 U( Q

  5. 2 \! c/ Z$ L! v3 r) X9 R
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    5 y8 N, u9 c% Y( }
  7. / Z" @  L) G( n0 V- t
  8. RewriteRule $ /error.html [R=302,L]! D) b+ ~8 [' R* r+ k# z+ k
复制代码
1 e2 ~' ?- J  Z

  v1 P: I# D6 C4 V# o
4 P: V( A( R+ J0 `" I: ?

3 n" g- k2 x: [3 V  I; F% {" \& b0 }, F7 O0 i5 {0 E

/ E& B( h2 N' I$ f* m

1.继续打开Rewrite功能。

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

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

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


- J4 q$ [5 _5 _& U' ?/ z

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


0 }+ f, k) Q& q4 X/ h% @

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

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

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

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

, e$ U' k0 b, \0 D, h

^ 表示正则的开始

$ 表示正则的结束

# ^8 }" D& z2 i; \3 O# x+ T; R' A

四、重定向RSS地址到Feedburner


* N3 }) J0 L& R: L

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

[size=1em][size=1em][size=1em]
  1. ' C& I, g; j: x
  2. RewriteEngine on
    ' A. F! G; J: _, n

  3. 0 r4 x3 t1 R( J- g" R6 e* z! Y! Y
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
      J! E$ A' k! X  P* z

  5. , R6 j6 n3 i, c  k6 l4 P
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    4 f+ X  C. W1 I  b3 Y
  7. 9 T* ~& e; {. a5 T
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    4 P( O" z4 I2 S' Q7 P4 h
复制代码
/ s" u( k3 Z7 Z% C" x- h( P
4 t! I& x7 D" ?; B5 G
- {3 ~* e5 b& |( {

* T1 u% V) k+ q  Z! r+ H9 O7 R9 {% T
" f/ C, b& Y4 L5 b1 l) [" g0 V5 b& _

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

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

- T& ?3 m6 t; Q+ {+ |  A8 e! d

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

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

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


. e. @! \. s4 {" F5 r! \* ]
: p/ p) P' f9 r, i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:54 , Processed in 0.070158 second(s), 20 queries .

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