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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:9 m- v, W, b$ K
7 ^, Z0 ?% s% ]) u5 _) ]

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

  1. ( u8 G6 N$ T# X! j# I- k( w! N' j
  2. RewriteEngine On5 U$ G% M: k( y$ @
  3. + G$ S, L# N: I
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    - b' T) J, ?' v: H: u3 {, A) A

  5. ! Y) n) L$ o" g' m- |* P' F7 ~
  6. RewriteCond %{REQUEST_URI} !^/blog/! Q3 ?+ O% E$ c# \

  7. 3 s8 D! e, r1 ^$ u/ s1 @
  8. RewriteCond %{REQUEST_FILENAME} !-f' I0 g  b7 b% v
  9. ' a1 y; H& B! c
  10. RewriteCond %{REQUEST_FILENAME} !-d
    / G/ Q/ F1 C+ z) ^
  11. : f& r( V3 h6 D5 `0 n7 `5 ^5 I
  12. RewriteRule ^(.*)$ /blog/$14 M' H' L1 w) o- K7 i

  13. 9 i' P" K2 M' ~
  14. # 没有输入文件名的默认到到首页
    , _- D& q" r6 w9 Q6 p

  15. 5 v( z) K* p1 r# Y5 V- o9 J% L1 x* n
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
      a3 g+ g1 W, ~* D, Y  d3 ^# @2 E

  17. , s9 A% }; f! i/ `/ w; O
  18. RewriteRule ^(/)?$ blog/index.php [L]
    2 M- F. h5 g# k9 G( a' Z
复制代码
0 L+ O! }$ R" g! d
/ n, E5 |) V2 u8 o" ]3 T( }. K
/ G3 g3 z/ n8 K- |, A, P2 ^* e
# I" {  [- S. K" f1 J# S4 I9 i7 Q
4 z3 ^# E7 Y" }  [

1 t: ^6 y  U5 \6 G! O

下面我开始解说一下上面的意思:
: m6 S& O7 d$ K) H7 x
0 R3 R0 o* l9 h3 F2 r" u0 u【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
. M; k$ `) U1 q) v( s1 f8 A. z; ~
( g5 X3 H( `1 q【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
1 U* N3 y8 J; l这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
8 H6 r2 [9 {1 [3 V7 G- M/ `+ k; K8 q9 {
【RewriteCond %{REQUEST_URI} !^/blog/】
& L/ I9 ?6 |( J" T$ Z也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$- |' i) N( P' P9 N

/ ]$ _8 f2 f) D1 G【RewriteCond %{REQUEST_FILENAME} !-f】
3 P6 o+ m: U: X, t( R% O3 P【RewriteCond %{REQUEST_FILENAME} !-d】! D! P$ y/ ^4 z- K( R
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径/ X# N6 h* a/ w6 x
0 O1 G9 B$ L9 N. k
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。1 e2 X' p* ]% P' Q' m
$ e/ N! k* V) H* o5 X. E4 y( ^
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
( ~- f$ h6 \5 ~9 G( m- D3 p【RewriteRule ^(/)?$ blog/index.php [L]】
6 y/ k/ X$ z# X. R# K这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。+ ]1 @6 s, k* \8 g) _6 h- s. Z

% R3 f) D9 W6 n% f' D' k现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
$ y* y6 q7 c* I* P* R6 G' P: U+ Q: F/ t答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
2 C% L2 [! c( lRewiteBase /
# k* s5 ~( H' M8 C/ n: f7 d
9 C. O2 {$ M5 x, }6 I0 ~% |( F还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。1 _! l# K& h/ A" Y; V
至此,完整的语句应该是:
5 G% E% z+ E3 }8 n5 V' N) G' g+ e7 M$ z2 G4 R; I1 b7 G, n

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

  1. ) m/ [. X, t5 d. g  R& V  R  H
  2. ####start####8 t# r, Q! u) t
  3. & w, f/ A2 O+ o+ z, k& `
  4. RewriteEngine On5 M/ O% r5 q: Z( J- _3 U' p

  5. * t8 v. ^( F$ A
  6. RewiteBase /
    + [  s2 f6 l$ }) O# y
  7. ) l0 Z% n) N( N+ c9 |4 q
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]6 s0 u: O/ W& K$ e& Z2 l8 K
  9. 8 Z& O( c3 s0 J2 r* V' A
  10. RewriteCond %{REQUEST_URI} !^/blog/8 b" V1 ^- m0 f

  11. 9 O6 l2 [% {' i) k' m
  12. RewriteCond %{REQUEST_FILENAME} !-f/ d$ H" [; ~& {5 E  Y
  13. 5 ]; T4 @2 F6 d3 s& B6 t' W, X
  14. RewriteCond %{REQUEST_FILENAME} !-d1 A& E+ K% O& b2 m& v; c8 R4 K! p
  15. , L1 j) J* \+ [6 X( v
  16. RewriteRule ^(.*)$ blog/$1
    . |- w1 x7 }) ]6 E8 U5 q% `: H
  17. 0 ?, `# d" }7 i( d7 a3 C
  18. # 没有输入文件名的默认到到首页6 ?: h/ e( r  P( c4 U
  19. " P' d! @% k3 h2 b) ^) w7 T
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC], _3 K9 I% B" [; c( S

  21. . x. e  Y7 |  Q
  22. RewriteRule ^(/)?$ blog/index.php [L]; G5 I2 r8 E5 G, t- C, q
  23. 4 }' n8 f7 R: ^: `9 u3 ^: E
  24. ####end####3 r+ ]# _" N5 |
复制代码

9 V) S2 c- H/ W6 S4 g5 T& U% G! N# ^
& K* x/ O* w! I; j% e5 |: J
( h6 h8 r1 @8 F' {5 [0 e

: ^. Z; C+ ?# V; B- H6 m3 f
2 L5 F+ g3 Z8 p3 s7 b' y& Q( g

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思! t) w' g8 Z: v( F

  ^3 R  F2 [" W9 g. S( c防盗链的语句,同样需要添加RewiteBase /,如下:
+ {, d6 [& M" a/ r$ G& _9 L
9 I, l5 x# G4 x% Z5 O) d0 x; g

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

  1. ) Q% c- e  P* s- \0 Y. z. N
  2. RewriteEngine on) \: {% b+ {* `6 M

  3. 9 V+ W) o; n& d; K5 u+ A
  4. RewiteBase /
    ; Y* G3 C" u- M  `; H' Z* e2 ]2 E
  5. 0 H* \. c8 i( N3 m, B
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]7 V* T" @* f5 L5 [" W
  7. ! D( p, J7 @- G: d9 p; u8 m/ e
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    4 C: s* G- [8 `" |, F& l
  9. - U8 L! f2 ?# ]8 f
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]8 t, l+ Z) D# g, O
复制代码

) R7 s( d: K; m3 I
" c: `3 H. d) J4 Y5 C7 P9 {

: U% x6 a5 q1 A4 g4 C2 ]7 R( q# L5 v) p
+ m/ L" e* j% T* C# ?3 I6 K
8 E7 ^& A( T0 p! d9 K

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。4 ?; E( w- I8 |; _$ l% \

' O2 y3 v% i; J+ }0 F+ `* T$ v下面附上简单的语法规则和flags:
; e; o* r0 Q# \% {) [6 h3 }【RewriteCond语法:】
8 S; h* c+ y9 ^5 }! i: W. s! w+ E# x7 YRewriteCond TestString CondPattern [flags]
: `: Q% T& l3 E! t, Rrewritecond的其他用法:9 s, [7 l4 T9 i( U) e) D- t9 p
‘-d’(目录)3 P- `3 A+ K9 X. v1 _$ @  h1 K
将TestString视为一个路径名并测试它是否为一个存在的目录。4 b) z( q( w( k/ k; f; y% ^! N  t
‘-f’(常规文件)7 N5 P: Z" B7 e" e& G
将TestString视为一个路径名并测试它是否为一个存在的常规文件。- l0 s6 u0 e% `& T
‘-s’(非空的常规文件)* ]* u1 u1 m" _, Q& U
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
3 r* L& t4 N( v9 E‘-l’(符号连接)
. o9 q; N* ^5 L2 b! n3 I( g将TestString视为一个路径名并测试它是否为一个存在的符号连接。
2 O& s9 c. v8 e8 J# \‘-x’(可执行)
# |" ~5 B- R' d- q+ ^2 H2 ~2 E将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。1 k# @: C  r3 t7 ?
‘-F’(对子请求存在的文件)2 B' F6 c; I1 a9 V: t$ Z
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!1 P; ~; A0 l  R1 L6 s! `( i8 D
‘-U’(对子请求存在的URL)
: t6 X" o% I& K  ^' N$ b* n检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
( v) W& x; ]2 D9 o, c; S' C
. J( k5 _" _1 ~& C, L2 [【RewriteRule语法:】
2 q6 T# o6 @$ w# ]% PRewriteRule Pattern Substitution [flags]% Z! x1 @% Z8 T7 ?! u2 e  m, k
4 N- w5 ]& {) y' m. U
【flags】:
& O* i5 t" T! V6 B9 d* m) F
3 m5 y. a- S% |7 j# i‘chain|C’(链接下一规则)
$ P) F% e- _5 s" `9 `此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
0 F. B' M, V4 f$ C& g& E: z1 S( b+ u( q; S7 ]
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
' N( n' J; |! a8 l) F: J在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。5 X/ n4 f2 d" }7 D) n6 u( p

) ~) g3 A* f8 h2 A" m* m7 w/ l‘env|E=VAR:VAL’(设置环境变量); V. s/ O- f& V5 H6 j5 A! R
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
2 o2 `) ]4 O* F6 K: s+ ?  n
7 f) z0 e6 L1 \9 F‘forbidden|F’(强制禁止URL)
* J: o# P5 j4 S+ o) o6 [7 X强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。* C$ O: V  W* t& a& a
( V% y, Z! L* x- z
‘gone|G’(强制废弃URL)) I% t4 e+ f% w$ _- n' L# J" [
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
; b7 \( H) J/ L5 x; b3 [( v0 W8 J/ T4 Y( T  }
‘handler|H=Content-handler’(强制指定内容处理器)
; H  I  ^- }/ z  F0 @强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。: w; I1 a3 D* G7 j0 U: a

2 D: s$ c3 G2 ]8 V. w2 z( F‘last|L’(结尾规则)! T$ T( W( I$ [8 J; o+ U
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。) V% C, W8 v- J
# p6 l3 g# e( l) ]
‘next|N’(从头再来)( c  F2 [. i% @- J4 }4 [: Y
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!1 b# L6 C2 |9 E* V

  p) G0 f( m* ^: k: H‘nocase|NC’(忽略大小写): L) ~8 A3 e8 k8 |4 c/ D% a, c
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。7 y( O- L' V7 J- Z4 \% ?9 a+ v
+ t8 ~, O# R2 x- F) L& {
‘noescape|NE’(在输出中不对URI进行转义)
$ A0 w9 a: ^' ~/ ^$ G/ f此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:$ E5 K, Y( n6 D" @/ b
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
, Z* P3 D# r: g2 p! v可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
! L0 s# N! d& x" V6 C: j! Z( h
! H9 u6 U# ~! g, F) c7 v; c‘nosubreq|NS’(不对内部子请求进行处理)
- e4 s! m: i* K在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。1 {( T/ A6 U# n4 M7 k
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
9 c5 a. O5 X# P: N; R: @& J9 U7 L9 ]
& C8 c) B% X9 C+ D& h2 ]+ d‘proxy|P’(强制为代理)
: Z4 q" H  ]; r; U+ [此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
1 G( n3 Z: H" }- ]( W1 a注意:要使用这个功能,必须已经启用了mod_proxy模块。$ J) Z* V) Y8 i2 M

3 U/ M, ^: Z& T2 z+ i9 [* q8 I‘passthrough|PT’(移交给下一个处理器)$ i4 Z. @, o! K* M( s) u8 V
此标记强制重写引擎将内部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 u; w+ X( A2 ^3 ?" n* O' {% u
RewriteRule ^/abc(.*) /def$1 [PT]
& S6 z' x& F1 p- uAlias /def /ghi% [5 Z" j& w8 {1 ?& |
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
0 B; s# [  n, ?' f' [& T) N( L7 w注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。. A; t# r6 S( d2 U, `% F

" l7 R7 u( u' l" U# S2 o‘qsappend|QSA’(追加查询字符串)
% x, t7 B, @( ~2 K; ?此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。! O0 H; v; t; h+ O7 F' y& B
9 Z6 v% Z' v) V3 v; c& c
‘redirect|R [=code]‘(强制重定向)" f8 F! _, {: Z( W3 \1 f/ ]
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
  U! ~, ^. l( d$ n% h0 Z  C* W注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
/ ]5 M4 e6 |. r7 I% o7 E, n# t
! j1 m- i! f5 _6 S: k/ H; q( R’skip|S=num’(跳过后继规则). n. c$ k! l8 L; H- `( ]( K
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
8 q2 A) W; k6 L+ G4 L5 x1 _7 u
! Y9 Z0 V0 ]+ ^‘type|T=MIME-type’(强制MIME类型)7 p2 u* M0 v7 |& W0 a1 m2 W
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:% n5 z4 s7 [) \5 D1 m% `
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]+ }8 S% q0 o6 {$ E9 P  r



$ h3 q" }& P- h) g7 q

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

* }) J0 t7 o' R, o& O9 l! y

一、防盗链功能2 _9 @" [. I) U4 X/ y; p; h

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

  1. ; Q! d- f# u! \" e
  2. RewriteEngine On
    7 T2 f! e7 c) C

  3. 0 ~* ^7 P0 j3 M3 c/ X3 g+ p; ~  l
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    ! Y% W! x) L- e7 K: _: @$ ?% |
  5. # Q7 T7 b9 }" y3 E1 e! W! d
  6. RewriteCond %{HTTP_REFERER} !^$
    9 ?/ v3 P; V7 w1 I* z; a, b
  7. 2 T3 H6 g/ I: j# J2 M& p( A
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    8 z$ h2 @% H2 t' b( p
复制代码
2 H8 _+ Z, B! o1 J+ l" v
: x, N+ u0 G5 M: C6 ]1 T

  g7 e! q# p5 I: E6 @+ o. N
- f; z" }/ U5 C6 ]3 y8 c

- \: _  u3 [. ?1 R* @
1 Y8 {  \& _- N4 G

逐行讲解一下:


% X, }0 X: @4 i* V

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

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

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

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


1 r# g* V0 d  l5 D: E/ [6 I

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

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

; ]/ A, I- {/ j3 e: a' w

RewriteCond下:

[NC] 不分字母大小写

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


& b, ?- k- l! r/ o  V

RewriteRule下:

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

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

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

$ `# o! Y$ Y( F; f

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
  e7 \, N- c3 |- D+ W$ N

二、网址规范化

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

  1. / a' V, s+ P" j+ G3 S4 X$ x
  2. Options +FollowSymLinks9 S  R" R$ S/ ]" ^( \# ?0 `
  3. ! R& J) s  u* q( J6 p! h4 u9 b0 Q
  4. rewriteEngine on4 ^/ i& Q% @; ?& G" H4 S$ ?

  5. + F( {( x3 ]( R4 c8 O& a# X& g8 ^. ]
  6. rewriteCond %{http_host} ^yourdomain.com [NC]; r1 p) V" K) C' u
  7. : Z: ~3 X0 r4 x) l, P' ]
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    0 J5 O- G5 Q# Q
复制代码
( t' i- ]. i" m" ~- b4 c

+ E* C, B6 Q# X+ }# |6 S8 |
# B8 Z$ B9 h! C: m" W" @
3 n. v3 w" M* Z

5 |( z! P- {, M* P

% Q3 S3 I8 L# }8 }3 y, Y; y

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

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


: C, v9 K! L7 M2 ?" d

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

[size=1em][size=1em][size=1em]
  1. 8 `  \0 H/ W0 L& ^6 t
  2. RewriteEngine On
      l# h" i+ _" A

  3. * @* r6 }' x8 G; m. |
  4. RewriteBase /  A+ q! j0 S! I; ]4 {4 l

  5. 5 n- h5 P2 O1 H7 H$ ]
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)- H% m/ i+ k3 o  m' e2 U& v' W

  7. 6 j5 c7 @) q  _
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    - k  ]+ D) {( G  g! F0 J) M; \
复制代码

" b- _& W" g* Z: {# b* z4 ^+ ?% H
4 Q; R. M8 v9 ~0 A6 ~+ Q2 H

4 X: R' E& Z+ i) D5 N( o; @
7 M7 m/ K, f9 V1 \3 N8 m) {- \0 ~) t# c

1.打开Rewrite功能。

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

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

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


; a7 |0 G) p+ U. f* ?( h' |

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


  K' B, d' _6 c' y5 a

三、临时错误页面


+ E3 R$ s8 s* o6 b" j& A  Q7 D& ~

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

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

[size=1em][size=1em][size=1em]
  1. ' M, V& ^2 m' r2 I
  2. RewriteEngine on, |2 a3 X- c' |. e% r% k; }
  3. : i% H1 I3 `- A) \; ?
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    2 S/ b' \+ B2 }

  5. 6 `0 p& M$ l1 b( v
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    + n4 q, w1 d9 k/ `

  7. ; D8 X  E6 ^+ |: ]
  8. RewriteRule $ /error.html [R=302,L], _; R- F* s' D5 j  a
复制代码
) \; W: e3 k2 |- n; H6 C
4 \2 O" S. h: b$ M/ Q

! ?, Q% j& D  a* C+ M1 a
4 Q- [! ]7 c/ [5 r9 s$ |& \# N3 d
! Z, x9 x( X) j  c$ h

1.继续打开Rewrite功能。

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

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

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

: e" E. x  z! v; y9 G5 U6 L' o

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


7 D6 |* N1 ^  _  P( s

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

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

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

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

5 q. {) c* \8 P+ z4 w. G$ h8 [

^ 表示正则的开始

$ 表示正则的结束

# @2 O! k$ M) p4 G; f$ @7 `

四、重定向RSS地址到Feedburner


( ^5 B8 K" j; {8 J; o

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

[size=1em][size=1em][size=1em]
  1. ; t8 x  z; C/ g9 x/ G# q4 n/ [! l
  2. RewriteEngine on
    6 m. [7 ^9 B, n) ?8 d# l8 D

  3. 4 `  r6 F9 L* ?/ d( z: [$ u
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    3 |  M, G' I5 E+ _$ l) \
  5. 0 \/ D3 V% ~+ b; H8 q+ b
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    ( c% C7 d% P/ U- y
  7. ! S" Q7 q: y" I( G+ C/ S. i$ K: d6 s
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
      g5 R, A$ R$ B" V/ L9 p
复制代码

/ {7 X! K0 q3 p" x: P$ S
# g+ L1 ]  @# ?2 s  q' f- t7 v7 g
/ r) B) e0 J) M3 B. Y% J* g

4 c7 ~6 F, E# \  k9 ]6 y
+ L- J* H! w5 ^7 I' J# T) k" N% r' f& z2 M1 }4 G$ V) v( x4 T3 f

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

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


# h8 w5 M" @1 W4 J. H

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

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

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


. L/ K4 ?- g) g- @+ j+ W8 x
9 C6 b+ S. t+ z5 \6 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 07:22 , Processed in 0.135093 second(s), 22 queries .

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