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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
" c- z. Y" K" D% I7 j5 E+ h
  b0 |0 }" F. ?5 x- s

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

  1. : [  L3 m- \& w5 x7 N+ a( w" h9 W
  2. RewriteEngine On
    0 d2 i( p% L. h9 {# p3 f

  3. 2 z6 ~. n8 s; f! g. d! A
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    - d3 P) _- Q7 Q  U

  5. ; y& R( P- I8 _/ a3 D8 m
  6. RewriteCond %{REQUEST_URI} !^/blog/& X8 t( h$ ~; g7 r/ e' t

  7. 2 R' t0 ?& w1 f: m- q9 v) G" ^
  8. RewriteCond %{REQUEST_FILENAME} !-f
    ! }: x% [1 `: S) m/ M
  9. * L+ N" w; [9 q3 i
  10. RewriteCond %{REQUEST_FILENAME} !-d
      r' r' D1 k. ]2 ~( p

  11. - y$ ~3 `: L% |2 U
  12. RewriteRule ^(.*)$ /blog/$1
    0 L9 E; f: M, [* V

  13. $ x- Q9 B. e( }1 N# {
  14. # 没有输入文件名的默认到到首页0 V8 D+ |3 I5 _; D* Y0 x

  15. 5 }/ A4 R, r/ t) o& p
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
      H2 q% g7 A, F! n6 X8 Q! |

  17. 0 c( D  J- [$ o$ }, R% S
  18. RewriteRule ^(/)?$ blog/index.php [L]
    ' W0 O8 o' Q1 p, \( g* l/ p* L
复制代码
- @0 \& n) T( F3 g& c' n

- D. U$ C0 l( A' F
, X9 q( T- h# Y  ]

4 u  u6 ]% o: h

! V7 Q1 ]4 P% v) x  j( G5 a

8 M9 u9 K! B# [, ?4 B- o9 u

下面我开始解说一下上面的意思:0 @# j8 ]6 _7 [1 W: u7 ?! ^8 j

# I, [. |2 c, {) \# |, r【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。- P( W& E; H& n8 l! G9 c
0 h: h4 j+ w9 O7 p, a  n
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】3 t, m& [! a8 `" e" x1 }3 p3 n7 f& d
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
% T4 ?1 L2 c7 Q+ B$ o  r& c3 A4 H; A- J
【RewriteCond %{REQUEST_URI} !^/blog/】
8 r7 ^9 n; T& r# ^3 S也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$8 C- Z  e2 x/ Y' B6 c& H

1 z" `4 ~* D0 U/ X& g【RewriteCond %{REQUEST_FILENAME} !-f】* h2 ?' f+ C1 _
【RewriteCond %{REQUEST_FILENAME} !-d】& p1 O' l. s2 P+ S
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径" D6 ]1 Z8 q  q0 F* }1 ^1 t, w
9 y9 J) e0 u: G0 L" l
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
/ L) |7 f- z4 |& f5 N1 J# G1 m
$ z3 k9 }0 K1 O& c5 F0 u0 }【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】8 @7 ^' U7 G. b' G& r( u& n
【RewriteRule ^(/)?$ blog/index.php [L]】
+ q' |" B+ B. f( N! @) S$ }这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
7 D) A0 L) O7 X1 H# T
' J: [1 C" l; R0 x3 v4 q. N现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
" a* g+ U# n! y" |+ W- `2 n答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:' I" g! j+ q: C7 u8 {- d0 X
RewiteBase /$ @4 F: V) `, w2 u+ [  P! g9 I

5 G$ a9 a8 }- V还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。! W7 f* H8 w+ m- ^& J7 @
至此,完整的语句应该是:
0 O# n' i7 E- C! f! w' j5 E' Y4 T7 q$ @8 v& _5 o7 l5 h

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

  1. 9 c6 w1 A8 d' V0 h" T3 H) \. z
  2. ####start####
    + I3 h/ I$ z. a

  3. " V: R' _5 x* A9 t$ p
  4. RewriteEngine On
    - P- {: U9 {6 V) B  q
  5. : r$ d5 Q/ O! ~+ H
  6. RewiteBase /: u3 y+ S, X8 I
  7. 6 g+ f, n, F% g0 _: n. [5 K2 r' |
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    ; _2 \7 m+ a  a) w- ]
  9. ! @& Y( _4 s/ E1 T: ~! m+ B- |
  10. RewriteCond %{REQUEST_URI} !^/blog/( f% J  [( B: I) O# h9 @4 m

  11. 7 y! W1 _9 \. m8 H/ u$ K3 H
  12. RewriteCond %{REQUEST_FILENAME} !-f5 {. ~1 n. I5 t* A( H

  13. - ?8 ^6 A( H6 f: T  @) t
  14. RewriteCond %{REQUEST_FILENAME} !-d9 E8 \! e, v% ^2 |2 U7 [1 ~2 C2 H8 O

  15. 7 D! t+ M5 L% B
  16. RewriteRule ^(.*)$ blog/$1* m( J  K9 V1 h2 \3 n% |

  17. ) E) y! I- f4 ^5 x' N
  18. # 没有输入文件名的默认到到首页4 ^: U4 b: c4 T2 R

  19. & x: L% T* b3 |- t* @" z  O
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    : u0 x6 _* U4 f' X: W9 B$ F, u
  21. + S- K) A1 v! u# }; t6 E
  22. RewriteRule ^(/)?$ blog/index.php [L]
    * H& `( O+ L, J7 k
  23. ' A. F% R, |' ?" e& g
  24. ####end####
    & ~8 M5 @5 p8 j1 y  k
复制代码
; O" J) i$ O( K6 ^! W
. A2 J8 V) S& s) C' j, _2 R

% u3 Q3 e: L' t7 {
1 s% F/ z6 {3 i- M

  E  S4 T7 s0 c! u: c# U: I

- ]; R* ^6 {' j- o* E5 I1 v

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
  Y9 v) M0 n, {
6 o+ \7 v$ p- ~8 W防盗链的语句,同样需要添加RewiteBase /,如下:9 U- j1 r% M! Q- V% [
* o/ Z' }$ w- D# l  \2 O! {1 m

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

  1. ' q% ^! i& u5 B1 {! Z( ?
  2. RewriteEngine on
    " N+ J9 Y6 \$ p7 q* i  C7 ?

  3. ; C& W' S, j- k
  4. RewiteBase /
    ' X/ b' }5 Z" j! v5 |
  5. # ~8 V+ b3 q+ ^( K6 D- T0 s* Z& l
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]  x5 J; r9 ?* c! _1 M3 O) d2 [
  7. ) k5 M) J+ ]2 I% ~  P5 u
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    6 X# ?" s) p/ N2 c' o) j- _6 m

  9. 3 u5 |0 ]; N0 f6 S; b! W8 X8 p
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]/ ]" F3 a& D4 ]
复制代码

; F+ i. g( D. T- T; k! L2 U4 r$ {5 A- t: @2 V

9 }5 ^( c  y' f4 e( e
9 {( S6 ^$ @' l6 Q

5 V, N. {. i4 p- u- V; j# }
( j: X, h7 m0 V4 r% G

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
- H" V( |( B. z- M7 h+ E! D
2 X" y" v& x* x9 S) T下面附上简单的语法规则和flags:
+ m& ~" P( o4 }6 Q0 G, p1 ~【RewriteCond语法:】
, I) Y, p' s3 ~) KRewriteCond TestString CondPattern [flags]
7 Y  B& s$ h$ Erewritecond的其他用法:
2 Q) b/ B! ~  [: Z- }- M+ y‘-d’(目录)
. Q9 q4 x: O$ Z5 q: W' N3 S8 o0 y将TestString视为一个路径名并测试它是否为一个存在的目录。
( l" `2 s& q* ^, l, I  o‘-f’(常规文件)
7 [3 |: l7 r! J, h; U& H将TestString视为一个路径名并测试它是否为一个存在的常规文件。. [9 r% b) R$ N+ Z% I- |& q$ b! J
‘-s’(非空的常规文件)3 M/ J9 }/ N9 B. h( Z6 s
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。+ v; i. r3 g  i. B: f
‘-l’(符号连接)
, N: _. f6 r7 D: {6 a将TestString视为一个路径名并测试它是否为一个存在的符号连接。
5 {1 R0 K; _1 ?5 N‘-x’(可执行)
& V9 I! K* Z1 G% Y/ G/ v# K" b- f将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
; o# S" A4 Y* P* r! I: F. _‘-F’(对子请求存在的文件)+ I/ \; A( P) U) k2 m* L( k; p; F
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
" k# t5 H3 u: K" y& Z/ o‘-U’(对子请求存在的URL)
2 U% i8 ]7 e% X3 a检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
5 E0 s: K7 w+ H  M1 l) W% |: e/ M; a( R* u  v1 f7 W
【RewriteRule语法:】
- }) N3 h' K& yRewriteRule Pattern Substitution [flags]
) L4 |! k* {5 p3 A0 H/ R: V! Y7 _. ]
4 n) d* v  ]) N6 x【flags】:
# J2 }* A2 V( Q8 h4 g5 ?
1 ], _% [# e$ n. R1 g; C/ ^$ y‘chain|C’(链接下一规则)
2 O" ]+ j8 _; P$ P( _( N: Z0 r  V此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。, K# t" V; A$ E

6 s9 x; m4 [% t2 ~* ^' k' X‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)4 C9 @" t+ h/ E$ H( @
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
- f- R* ?6 l6 P1 y: g: M& F& P7 v; ?/ K
‘env|E=VAR:VAL’(设置环境变量)
. E, \! J# J; e5 A. a2 A+ n此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
; P: j/ f9 N7 ]( y" c; n
  @: d4 Q4 k+ [0 t‘forbidden|F’(强制禁止URL)
: C+ t% ?& T+ }强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
& f: c9 @8 A( \8 y9 [$ K  F6 @: K0 a8 z3 V5 _; w
‘gone|G’(强制废弃URL)4 I2 b: F( H( N7 y- X
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
! e( a. f6 M7 `
- F% R( E- ]' {3 F, g8 ~‘handler|H=Content-handler’(强制指定内容处理器), q% e  b6 v. k/ x# s' ~8 @
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
9 I. ?! x1 A" p' |! e
  l. V2 `  [6 [6 Q  F. d‘last|L’(结尾规则)) c- x. P/ z$ z3 o0 p: K/ {( x# l
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。- W9 D$ `( q4 p1 l+ n  H2 u, m  U6 c
2 W" ?6 [. J$ n. K
‘next|N’(从头再来)! `2 H/ ]* F$ C& {% K0 Y5 c
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
0 v& l8 J( w# G. O4 }/ L* M: ^3 J. _  j" n( W! ?( v5 Q& q7 f
‘nocase|NC’(忽略大小写)
6 ~) i1 L  ]  |它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
: V! r+ `( X, S" D5 f, a6 G
& r) D' U5 e6 `/ e& e‘noescape|NE’(在输出中不对URI进行转义)
% m2 }8 [' Y, o* d6 n此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:0 H2 U) I! g* L4 Y' R" W
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
9 r/ d8 X2 _- A* Q0 _$ f- ^# D) h可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
, z5 L; R( x7 R( F5 c8 E! X
4 u7 Y9 F$ v) I9 ~$ V‘nosubreq|NS’(不对内部子请求进行处理)
9 l/ f+ L% a- N2 A: d4 W在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。" B. J6 C4 _! x& B& ^7 v
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
, \& r2 n# a: d( X' O8 t/ j
# R* |! W% n! M% ~+ h( z8 L; _‘proxy|P’(强制为代理)4 N3 K, ~- G$ i
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
+ w: B" h3 B$ Q4 }. C注意:要使用这个功能,必须已经启用了mod_proxy模块。
. ^+ P5 j- s8 H3 F# D9 _9 W! B6 {2 p, c3 x, f
‘passthrough|PT’(移交给下一个处理器)6 x' e* C  L6 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,可以这样:
8 f  @8 y& }7 Z" }RewriteRule ^/abc(.*) /def$1 [PT]. O' d- R) I* `, O
Alias /def /ghi* y1 @* s/ R6 V3 k9 H1 o6 b5 S, _
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。  Q2 U+ t2 _7 N: P* u
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
  `& i8 H& m( V- P+ V' t& Y
# `# B9 b! x2 a: l‘qsappend|QSA’(追加查询字符串)3 |0 x* S# e/ Z1 g4 U1 i
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。1 y8 H& Z5 E( J% L+ N& T* e

* [) @# y, s/ i9 f) p( y) B‘redirect|R [=code]‘(强制重定向)
0 V8 C  f/ L1 ^  a( A若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。, |* q; x' q* B3 S  y
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。. r( e0 R$ _. F# P  n9 R
& H* m  [8 B- c8 F0 b* W  I- U
’skip|S=num’(跳过后继规则)' J- ^: j" ^4 h) u0 E
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
6 u1 r& f  `. U- y+ o  T* g
8 b& y; \& C1 K+ y6 {7 m‘type|T=MIME-type’(强制MIME类型)) h- F2 e6 Y1 ^( M
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
+ q( D' l$ c1 Y7 aRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
, O) {* F  G  |* Y) ~( @



- U4 x9 O: v$ p" g" ^

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


7 e& S+ b0 x& S" F+ p

一、防盗链功能
' V9 R* a; @  J1 D, Y

[size=1em][size=1em]
  1. ( U$ N( G5 `7 Y! b
  2. RewriteEngine On
    - b: Q6 [: T; r) p

  3. ; t3 z, c5 G# o4 _* q+ {
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    4 G# ?8 I0 L" l" {* J7 D7 `9 M1 L

  5. ) j8 c/ ]# t* d5 B: P, L- }
  6. RewriteCond %{HTTP_REFERER} !^$
    ' r( h% c- M: V* D+ `8 V& f$ T
  7. 8 I0 y  u2 c2 I5 j$ L2 X+ y/ u( m* T
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L], Q7 v0 Y: M/ M# I
复制代码

! W5 o0 ~: L% P7 b$ N2 e, m9 @6 t' b  n6 j  D; M
- I! a4 h  u. N4 {; d

- I( l3 R. [- y6 {7 _. D5 \
3 t$ l# l, A6 x4 o
* h6 z+ ^9 k! E6 H

逐行讲解一下:

2 c( ?: V/ _9 H# }# m+ X

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

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

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

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


" Z- n2 r7 i+ E7 W0 c

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

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

8 E. i* V$ V/ u5 X. g

RewriteCond下:

[NC] 不分字母大小写

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


8 Q4 H& q, f; Y8 F2 Y

RewriteRule下:

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

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

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


0 a$ v, G% ~- w: E( o5 H

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
8 P# B+ o! j; y! a- F4 n, K  A

二、网址规范化

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

  1. " K' X$ c0 c0 y$ {" [
  2. Options +FollowSymLinks. O% x0 g9 j* p# b; G9 V+ c+ t
  3. # o3 x  L1 [- Y3 j( ~/ o: d8 ?
  4. rewriteEngine on( b" L# p. R$ r7 |- P

  5. . _" \) k' S! ^  q+ Y
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    0 J7 [  i4 S$ Z+ o, v

  7. 2 A4 s2 L7 i0 n$ g' K+ \: T
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    1 V8 o# r& `5 Q, g3 D
复制代码
! s; ?) J6 ^  z, ]0 W* d
5 h# E/ U1 O/ [' o

2 A, S7 `" b4 _# M5 T% E/ K* X& ?! O) B' m

% J+ F1 D. o$ K, i1 \) H4 F
3 {6 U0 ~& Z% n) ~7 `, J4 c& C

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

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

3 g1 \2 M5 z5 G! i

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

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

  1. 4 |4 O" n, C9 F, t' u
  2. RewriteEngine On6 z- ]4 }& [4 H* F0 g& S

  3. $ e: W8 j( I/ R# M; U( f
  4. RewriteBase /
      [6 V8 D  k4 K+ k9 @$ j

  5.   A' R6 {- E3 ?2 E7 M
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
      I$ A& s6 R* Q/ [* M3 M  B2 z

  7. ) N4 G2 n: G$ O  l( a2 A
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    - u$ o& f' a5 f0 X5 T
复制代码
8 p/ H( N& Y: y2 o4 Q: \  T% m& U

. ?- ~  V. A: U2 `
5 A5 t/ N  |2 R
% U4 @+ b0 {. C, U3 x

; d* E( H! h- Z$ V# z- l/ L6 n& O; f9 e) I

1.打开Rewrite功能。

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

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

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


5 [' e& F/ R% n& f

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


: D  D) \, O( M% ]' j1 K5 a

三、临时错误页面

$ N8 U; k- i1 A+ N  C

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

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

[size=1em][size=1em][size=1em]
  1. , k9 g6 s/ C; m7 d
  2. RewriteEngine on
    , ]& D  l+ [4 ^6 L: K& r8 P4 R
  3. # M% l; v6 D2 j; a: ^
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    9 z8 y! |1 a* e* \, r$ I; p3 U4 r
  5. * B  t: s" N" d7 y0 o( `
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123% E0 n1 Y6 B7 {7 X1 Z+ i

  7. ; g4 T  Q7 U# U2 V+ j5 u
  8. RewriteRule $ /error.html [R=302,L]4 F0 X1 t3 I6 p! `8 R
复制代码
9 I- m/ V+ {  R7 M

' W" F2 A1 ?( u! J2 _
/ V8 M8 i  v2 ]
: k$ G1 w& T9 R* b2 d

9 \$ k% T( y. q1 V9 K6 d/ A
: I: s0 q% I3 R5 N  \% _

1.继续打开Rewrite功能。

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

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

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


- C' A+ P0 g: A& q& o

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

5 ]7 B- [+ _' u) d$ P

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

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

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

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

$ t! C& O, v0 i

^ 表示正则的开始

$ 表示正则的结束

1 @1 v5 {% v4 O  w/ E2 v4 D) `# H

四、重定向RSS地址到Feedburner

+ G! Z2 V4 W- W+ h- {# Q

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

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

  1. : l$ o! `, S- ~) p5 r
  2. RewriteEngine on! D. b- E9 p1 x+ Z1 m% s; e# X

  3. 1 l% B* I- F4 x# E- h8 I# A
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]( \- [5 @" I/ Q: R$ R- A
  5. 1 V6 P( z1 n3 N: R& q
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    ! k$ ~3 Q  B. y* [; W
  7. $ z, m$ G+ o' I
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]  }2 X5 N0 m6 S. H
复制代码

3 [- ]4 v' ]9 P" ^8 D2 _
/ i* R/ q% R9 C2 g) k2 p: z

5 r1 |/ O4 J* J6 W; P7 a
- n* N9 }* o( K! b) z. F2 i7 Z+ O) J9 m$ I" x9 J8 H

1 B5 ^! q  [$ j# k$ b

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

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

8 D* X/ J; W% ]3 p* S- |

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

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

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

. X. Q! K+ v" L# _! k/ [
5 R% s" n5 ~6 t; \: h2 N% K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 15:27 , Processed in 0.128232 second(s), 20 queries .

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