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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:9 ^1 {3 e& O, R' i4 U

9 e6 s9 r: {) H# m7 H# ]- v

[size=1em][size=1em]
  1. 8 [2 X( x5 r" o4 {! n
  2. RewriteEngine On3 U' w, G1 u/ R0 c3 Q4 I) t

  3. + f( e0 E$ J& D  M$ S( V7 X
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    # Z% `) W$ r; n& ?( ^
  5. # o6 D( A7 O& ^1 H2 a; O9 ^
  6. RewriteCond %{REQUEST_URI} !^/blog/" @2 a# m5 x; R8 k( K1 G
  7. 8 H: n" |! \( m- K( F
  8. RewriteCond %{REQUEST_FILENAME} !-f
    * ^! r- A0 q# g  E8 L5 F1 s
  9. % F7 ^+ p  F% S
  10. RewriteCond %{REQUEST_FILENAME} !-d
    1 ]+ l$ F" E+ y8 t, `8 Z1 j, H4 [
  11. 1 t$ R6 U, j( J) b
  12. RewriteRule ^(.*)$ /blog/$1
    % c8 k4 A/ J) S4 y# X* g

  13. 4 H' p( z+ S! v) n( |
  14. # 没有输入文件名的默认到到首页& S' M8 n% k  T# G. v0 X3 w

  15. " C8 a* M1 e0 J+ h
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    2 e3 O4 v0 e' \. W7 M1 a: E$ }: [8 t
  17. " l  {- ^* j8 W/ ]9 x$ W
  18. RewriteRule ^(/)?$ blog/index.php [L]
    ! M: _: O  ~% Y+ t3 q' Z
复制代码

" L( e; \( L0 M- I* S
2 L! h' N$ D8 y# k

5 K. e0 ?8 \5 Q. \
3 ~2 p/ _# E- h+ B

, u) B' P5 f# K2 n
0 d  I! r" Y  r& n' V" U0 \

下面我开始解说一下上面的意思:
- D) j0 M+ G) A/ F
, i% ]3 C% `0 v1 Y( H2 z% I【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。+ T* `" J6 u* Y' o8 {& M. l
  Q# o, v' _/ q2 e& Y5 q  o
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
: \6 U3 ]" I; D2 m! a  ?5 \这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。3 l# T( s0 }4 E" U7 m: i
: b5 v" D2 F7 Q" L" |
【RewriteCond %{REQUEST_URI} !^/blog/】
+ u' S5 d8 x. d8 A* v5 N也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$1 o0 c4 y7 q% T* i8 U

8 m! N6 [6 `9 f# P* P【RewriteCond %{REQUEST_FILENAME} !-f】9 o( w( {1 ^3 m% o; G: x$ U
【RewriteCond %{REQUEST_FILENAME} !-d】
; q0 I0 D+ M1 `, u这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径+ b6 j0 Q! ?& T8 }

" ]7 {& L& H$ B; X( J: I; q( s' R【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
8 m( z$ `, j) H1 }
9 A# i( T. U# F& y! j【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
/ k7 V+ v7 K4 ^$ h% t$ y【RewriteRule ^(/)?$ blog/index.php [L]】
( T) v  r2 O* p7 |1 \( `1 K这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
2 g! e2 b7 K( ^, e0 C2 y6 e" d0 h% d3 w
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
' _7 {* a' L, K  B$ [6 \4 x答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
( R- Q- ^  I% n$ ~RewiteBase /6 i% K: S& o% {. Q

5 b1 A: A) |" e8 p2 _1 I还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。( R* E9 V1 u4 d9 \9 A, h
至此,完整的语句应该是:, n) \6 ]$ L: y! _

* f4 i6 Y& h/ X0 L/ t  X3 j

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

  1. ) \7 ?3 Q. j" L
  2. ####start####- u2 C! k9 B0 }/ g

  3. & E7 x3 c3 M. a7 J5 f7 J" t% X
  4. RewriteEngine On% |( Y) k- Q. N

  5. ! y) Q- ^4 r+ [* D: ?
  6. RewiteBase /; y( l" U/ @$ z

  7. 3 q& H/ @7 L  W
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    ; p( v5 l) O$ L% k( f
  9. 2 G0 ?$ |9 l8 v
  10. RewriteCond %{REQUEST_URI} !^/blog/
    1 _2 v( I! V* B" b

  11. ) e" w) H" x( d+ S
  12. RewriteCond %{REQUEST_FILENAME} !-f; W- @! O- k8 Y( e
  13. 9 T0 a, t. c2 b& u% q+ N; d
  14. RewriteCond %{REQUEST_FILENAME} !-d# X* M& @! u% l, Z
  15. 1 f- h6 u! p+ D* K' C$ p$ j
  16. RewriteRule ^(.*)$ blog/$1
    ; w6 I- q. I6 T9 }! O$ c9 B2 X- v# ~

  17. 3 e! t+ ~1 |5 _! F5 D; N4 ~  U
  18. # 没有输入文件名的默认到到首页8 P6 k3 d" }0 A
  19. 7 x" @/ f0 P' G/ O$ i) C2 O% p& D
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]! Q6 ~' o3 _4 K, J  C
  21. 6 B; y- q6 A1 Q
  22. RewriteRule ^(/)?$ blog/index.php [L]
    : y( [* g) e( U/ ]% g

  23. 5 h! |; b8 U" Z
  24. ####end####
    2 ]  [1 g% s1 s. v
复制代码
( f) O1 K, Q* @; V
, L) V$ y2 A, u! [" [- n
8 [4 }* u8 t( P& Z
4 \) `2 N, }" f+ l9 _  i1 N) w

6 C' J/ z9 e$ e1 p( ]! Q: v

0 d; g0 P# ?- Y9 a+ Y

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
: f  \  G: R4 ~7 C! V- F
( Z: q' W! Y3 V  T! w( s5 Y防盗链的语句,同样需要添加RewiteBase /,如下:
, M7 k, t$ I. R4 d" u$ i0 u/ |; u1 b7 P: S( f9 F$ {

[size=1em][size=1em]
  1. 1 k  @. g1 m, E2 q6 s# y
  2. RewriteEngine on; f6 M# v+ i, N1 x5 R" z" {/ y9 ^
  3. - _2 i9 ~- E  p, P1 b
  4. RewiteBase /
    : u; [1 G! k* \
  5. % S, g! C/ a* O- t1 l
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]- _/ H  s6 _2 E+ P$ F/ R
  7. : O2 z7 J2 h2 H0 e( G1 v
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]* k# i- w2 r6 s! |- f4 W/ E

  9. ' [8 M! G# q2 T4 g
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]$ d- m5 j( Q, Y* j1 w+ k
复制代码
$ R) D. p4 T$ r9 W" I" w
7 m1 B4 z& b' r. Z5 D1 R

  Z8 K3 @7 g6 m) c
* w' W; c; H" _; d9 z2 x+ G5 x' R5 t
: R: k2 }: y: I

7 h6 d. o6 ]6 a5 W4 V9 T! H  @& b

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
: D; E! D% B0 L# e2 Q
5 Q+ I8 y/ V9 k  H下面附上简单的语法规则和flags:. `" Q, }0 E9 t: K3 A% y
【RewriteCond语法:】8 R% `+ @2 {) z. ~
RewriteCond TestString CondPattern [flags]
, X3 \& s2 {9 [rewritecond的其他用法:  M% _$ i% u' i8 D. B; y$ U9 j
‘-d’(目录): X2 c( J0 R( Q2 X5 @
将TestString视为一个路径名并测试它是否为一个存在的目录。; r: p0 N2 m# A& z, N
‘-f’(常规文件)+ a+ S, S: M2 _
将TestString视为一个路径名并测试它是否为一个存在的常规文件。' h4 Y0 F' D6 n% M( ?
‘-s’(非空的常规文件)) o( w  n: w0 L; ~+ _! h% e
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。! M- p0 }/ L4 ]8 y
‘-l’(符号连接)1 S8 H( M. S  W: `2 V" M& }
将TestString视为一个路径名并测试它是否为一个存在的符号连接。6 O4 w; F( m* I/ T: S
‘-x’(可执行)
( b* C- U4 D/ ^( ~+ }% S, O5 s; x* i, M将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
- A* k; }* }3 ^+ W‘-F’(对子请求存在的文件)
9 @, D* c5 Z) ^& v$ A检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
4 I& L% I% W0 g/ S  w/ V, U‘-U’(对子请求存在的URL)
7 G" E4 L3 w2 G检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!. M) [1 Q" H8 c9 R+ m; O7 u& i( g
5 C& P& [4 b4 A$ b( G; v3 A* l" l0 V2 i
【RewriteRule语法:】
8 E6 h" E! D9 n9 }' I4 n! I5 QRewriteRule Pattern Substitution [flags]
8 Z, v8 b- x* C1 q$ E
7 H# B3 _4 p& g8 u6 l# G' i【flags】:6 V# `1 E) l' l. E" T
6 ]; D9 _9 O. K& p; R6 o
‘chain|C’(链接下一规则)
4 F( {+ @: D/ z& o# i# z此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。( j3 ]. p& A0 u  B6 L( S' K* i3 s  g/ C

: g/ P0 q! d+ S9 ]. y  w4 B‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
  D" c, `2 F8 B+ ]在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
7 A) C% a9 J8 G, e2 h
2 X' g" E7 H; m. i8 Z: Z2 c. g‘env|E=VAR:VAL’(设置环境变量)
6 d% s4 z/ _* q( ^; x4 [- A+ r! d此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。2 T* S& i) K. C) G0 T) f

6 x! y) [9 t4 @; {4 C4 [$ Z‘forbidden|F’(强制禁止URL)- {0 V% t8 d7 U# }- b3 P3 s0 c6 _+ a
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
4 k6 H8 B% _8 C2 I: r8 U
. I: r8 k: w5 [% s* j- q+ I. u‘gone|G’(强制废弃URL)
; ?' x$ w' A% F) l强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。0 x' _. ~: s7 ?& f! d+ F! K

) v- E5 T/ X  l: K‘handler|H=Content-handler’(强制指定内容处理器)
* {% M1 r( X6 W& m( a5 {强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
+ b2 w5 ]' [; m+ E
1 Z" Z2 w3 f- q1 c9 p‘last|L’(结尾规则)
- A; C8 X  y" A. C3 T( a立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
6 A& m7 T: M% m0 [# |& T/ x
$ @+ G$ Q6 k1 y$ K8 x‘next|N’(从头再来)
# X6 f- J# i) t+ D& A重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
6 H* d' A. e0 V5 \3 s9 W: L6 e6 o- s7 R
‘nocase|NC’(忽略大小写)
' W. N( f3 u7 F' v它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
( k+ H, R7 j3 I! V' v  o% W4 m" B! _& I- P
‘noescape|NE’(在输出中不对URI进行转义)
+ u/ X0 e) x+ d) [8 i此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:/ P$ E+ `! ]) j
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
0 ?% l5 f' C3 k0 D/ p可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
: G* k, U( r' \, y1 |( w2 q3 u3 |) m$ w8 e
‘nosubreq|NS’(不对内部子请求进行处理): ]& }# y+ S0 i$ k/ o* N
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。+ l: u) D# x, u' _
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
9 F/ M: F- n, d7 c! o  v* W( T. I6 u$ P: ?+ G# g, y: J/ K* I" g
‘proxy|P’(强制为代理)
) E) T: y$ w# o此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。0 J! @& R+ o8 Z. }! [
注意:要使用这个功能,必须已经启用了mod_proxy模块。
' R' Y# B+ V" V3 y1 u% H3 Y, ?# i# H/ Q6 h6 G7 Z8 s# r7 V
‘passthrough|PT’(移交给下一个处理器)) n! C( P5 U! P
此标记强制重写引擎将内部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,可以这样:6 W" G. |: c, d. u  Y( k
RewriteRule ^/abc(.*) /def$1 [PT]5 e1 x0 @" M% k' C" A3 O+ E5 F, F
Alias /def /ghi
) N; d- S. {. j+ @. m" `) `如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。: J- u3 N3 ?$ h! k  H6 @
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。& J0 P6 I% z3 S  m& w3 i
3 b. _/ h! |5 \: b" E% P
‘qsappend|QSA’(追加查询字符串)
' K" r, q2 k6 X  P) F此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。* W, E1 {% y2 c4 `  {4 k
5 K6 s6 P! _: |
‘redirect|R [=code]‘(强制重定向): X. a  u+ i) a+ f  m8 N
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
0 @* u) ]( w( D( b注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。7 u& H- L( Y0 d
: J4 V' q" P1 ?; ]! Y
’skip|S=num’(跳过后继规则)
; N: y3 U, e, r/ z" R此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
! C" W& M4 D' N1 f8 C+ T! w
5 F4 Q0 ~/ V% [( r‘type|T=MIME-type’(强制MIME类型)
( p  a% s; C4 E3 M强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
1 A# L) U+ H, u% E& K7 [1 l  WRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
9 M+ _, b8 o  s/ l2 Y6 W



# Y% c% W/ N1 F0 n

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


0 i( G8 ?1 o8 |" A/ H6 n1 r& Z2 L

一、防盗链功能
0 r, U- h! K& W8 i6 [" P3 U, @

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

  1. 7 I4 S( s7 f. E9 x5 I" Z/ J
  2. RewriteEngine On: z1 H: v% `$ x' D3 y$ Y# T

  3. - z3 ~3 ]! w! C' Q, E
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]' G5 J( ^3 [- T) `

  5. : M4 l( S3 q6 S. P: G! U
  6. RewriteCond %{HTTP_REFERER} !^$. U# l' z* L$ q  g

  7. ; n) o% C* l& Y* I
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]( n- b3 l9 {) d* C2 R5 k! S4 E; B
复制代码
/ e$ s0 s- l9 d$ l

- y2 Y0 C, ^" K" P  `

) q% o1 q/ j! j5 x5 {  C" ~* a9 y2 M( _" S

# T6 I1 R# |4 y. y; M6 w. W

! V% r, r& w- y  V6 U! h; Y

逐行讲解一下:


/ |  C7 u( Q1 y& j3 }1 f6 Y0 V% d

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

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

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

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

$ J9 w& ^8 R" l  H

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

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


2 r4 ~; `9 C8 K9 L, I& B. T

RewriteCond下:

[NC] 不分字母大小写

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


) p, d) V  P( V5 }2 i& M1 M) t

RewriteRule下:

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

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

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


9 Z5 d1 c/ ]: r" \2 x8 L2 `

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm/ {' H/ X% \8 j3 C+ A! ]  c' x

二、网址规范化

[size=1em][size=1em][size=1em]
  1. * w( R$ j" e. T5 _( P3 M
  2. Options +FollowSymLinks
      u+ D3 L8 ]/ ?8 _
  3. / J: P0 ]  i" M& F! F* j
  4. rewriteEngine on
    " R/ C1 i- P6 F/ o

  5. . k% E$ q/ i5 ]4 {
  6. rewriteCond %{http_host} ^yourdomain.com [NC], d; D' ~5 w6 h* F  r3 J3 F* w

  7. 6 V" |0 N* r, U6 N
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    * j& f  F+ o( D
复制代码

, G* ?5 Z0 U1 D8 u* R9 M" q( c# H! M8 J

. i5 `5 e9 S- F6 t+ A- \2 m* H" E" C, d' K( k7 q

% X  `- l1 l2 z$ ~: e/ v' x
" \/ R# O" Z# L2 x! }

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

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


0 C  S2 Q2 C4 I

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

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

  1. ; {2 M8 E) y6 y" B/ m- c
  2. RewriteEngine On
    / m0 v6 G1 q9 {+ A. Z9 f1 i" T4 K

  3. 6 F% N! c- e/ U+ Y0 T" F! z6 r9 Q
  4. RewriteBase /5 ~$ q( X- W7 `1 [0 C+ i
  5. + y2 D6 ^. @. k* O; S
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    7 ]# m2 O1 B( U* d0 n2 [& w
  7. * s1 p0 f: c- [) w
  8. RewriteRule ^ http://abc.com/ [R=301,L]$ B9 H& T2 ^9 D
复制代码

* X: K( C( F: [, S" d. Q- ]: s( P: |9 n: j3 Z! m0 B9 m( S* d
4 P+ p8 ?! u# F. L; D
  k; D* `% _6 m
4 E2 Q' U; L+ ?% a9 U+ W

0 Y1 ^- G0 B. S" Q

1.打开Rewrite功能。

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

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

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

& Z) w& M7 r$ f/ c5 n

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


+ m8 W' X- D+ r, k: c; H

三、临时错误页面

; a& o# X7 L7 f3 T

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

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

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

  1. - v3 G# q6 L7 y4 u! \: y7 u
  2. RewriteEngine on' y6 e3 ]& T- l; [! W8 w" @  o
  3. 8 Q& C, P) s5 Z3 p" W
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$4 x- l* M0 u# x1 c! P
  5. 8 S5 e3 J. y' {) r- u
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123+ o3 y& j1 s5 {: N8 I! M
  7. + N7 j( ]- R% V
  8. RewriteRule $ /error.html [R=302,L]
    0 F7 \1 I8 U( R3 a% q
复制代码

) `$ @2 ?: I: x1 u3 l4 L. }5 l8 I$ \6 E& m3 J( [

! \4 E+ M% A, z6 b9 K& d
  F' s! F6 E8 ^9 a' h6 z7 W9 _
( d" R  P3 R3 M" q5 P: n# g5 t2 g% E9 Z4 {

1.继续打开Rewrite功能。

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

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

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

& q  E$ s1 r% }+ H; l# c1 [

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

' @0 z2 v" D) b3 F

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

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

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

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

# C7 `' b' y9 _' h9 z% S) n( y

^ 表示正则的开始

$ 表示正则的结束


& n; v8 g4 j  [; D7 Z: b4 N$ S' X

四、重定向RSS地址到Feedburner

8 [$ v( ^* G+ i2 [( a

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

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

  1. ' O$ K  ~# g: E' V$ q0 B
  2. RewriteEngine on. |1 C7 x- n2 d& l! [" p

  3. - L6 G  \* P+ K
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    . Y3 i4 _( C7 Q/ k

  5. 2 a1 f+ N; T0 a2 j$ ^3 _# F
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    : ~5 t2 y0 C9 w/ K7 P
  7. 3 d+ W2 ^! X; ?
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]+ l. J7 s* B0 d
复制代码

2 b5 X* o3 r4 ?4 @- n- e. F  Q: z0 |4 G* T7 p" A% P

! i) T/ H! l7 n0 }9 m" O/ T; \
" r; y. C3 {% A9 }, d5 X9 L1 H
% j* [/ G7 R9 N& ]
% h# i! x* _) P" f: g% j

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

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

3 N; L# O+ q! w' b6 j6 u) j

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

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

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

4 t6 }  }0 k+ {5 V- l/ f

5 o' z6 Q# I5 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 17:48 , Processed in 0.114770 second(s), 19 queries .

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