cncml手绘网

标题: .htaccess中的apache rewrite规则写法详解 [打印本页]

作者: admin    时间: 2019-1-4 14:36
标题: .htaccess中的apache rewrite规则写法详解

.htaccess中的apache rewrite写法:) }  G$ d% ^1 H9 K0 f8 J
# f4 l! z# m5 a8 h( g8 w$ t' S

[size=1em][size=1em]
  1. & B: D7 I% |7 m
  2. RewriteEngine On" {* t4 }0 ~/ v5 M' v7 g, U
  3. 2 S8 _4 I/ N  T0 A; a8 N. [
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    5 V# E+ V( w) M. Q( [  O% j! N
  5. 0 I% D& C, Z; d7 {" n* B
  6. RewriteCond %{REQUEST_URI} !^/blog/& F4 i% o& f8 v" M6 ]8 G

  7. 1 w% }% h% J4 x0 G2 I
  8. RewriteCond %{REQUEST_FILENAME} !-f
    4 t  F) y. O: H+ V  ]. K) K
  9. 0 V& t+ u5 P: J9 m: H5 W% w
  10. RewriteCond %{REQUEST_FILENAME} !-d2 W: n0 @2 p9 O+ z
  11. ; W1 k/ i: q3 T
  12. RewriteRule ^(.*)$ /blog/$1
    4 ?6 w9 i/ o. i. l8 B
  13. ' n7 C0 }1 b& I# S" N: b# ?7 _3 _0 o
  14. # 没有输入文件名的默认到到首页
    & d2 _4 _* S* ~; i8 s: m

  15. 4 Z/ h( h7 P# @& Q8 v% U. c/ R
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$1 I. @6 v1 G; n( [( V! o

  17. 6 x& E* N* p6 H2 E6 o4 v
  18. RewriteRule ^(/)?$ blog/index.php [L]3 Y$ O& z2 h+ u7 k) j
复制代码
7 K+ Q- t# H( T, B) R' I* Z

$ V( E1 a6 N+ D- d7 }9 g
) p/ B6 v" ]7 n" i
- t1 }; T, g5 Z) {5 E
/ X- r# R: e+ W9 R9 P( p
! K% S) |: p+ i

下面我开始解说一下上面的意思:
8 Y- g( p* O3 m5 ?7 i$ b0 }* c
7 V1 G0 j& B( Y9 m! |  D【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。& v* d+ b' }  a( a  [( w: o

) T7 c& S8 R, P) ?) ~0 r【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】/ e! [+ r+ p9 R( n! k
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。( t( L0 c4 j+ F; n8 U

* Y$ c; m& H% n7 E/ O/ W【RewriteCond %{REQUEST_URI} !^/blog/】. s+ Y( l, S' j: X# k4 z. e5 C
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$6 i: u. Y5 v5 R* @
0 O* f/ b5 y2 k+ D$ P3 F
【RewriteCond %{REQUEST_FILENAME} !-f】
4 Z2 L+ ]2 S( H! p$ N5 z# p【RewriteCond %{REQUEST_FILENAME} !-d】; Q. M2 {) P& M2 Y5 `$ F. D% u
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
  |" Y2 }  L" B1 d) I
- T7 d  s7 o7 g, b) T【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。' D9 M: o9 u4 M

9 |% @- k3 K6 k# E' X% F4 T. S$ {' P【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】$ N( w% E/ a3 w+ _9 ^
【RewriteRule ^(/)?$ blog/index.php [L]】- [7 f6 `# V/ r/ q  R5 p
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。4 W$ q9 Q6 ]0 @3 a8 }' I

, B8 B/ @. ~0 y) }现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。& E; {' a% D1 k1 z2 q4 L5 t
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:- k. f0 i6 u4 b
RewiteBase /
' u/ p* B7 J+ `4 U* I# s1 b3 a+ [, X1 {1 [% E- q% n+ f) n
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
* C4 Y( _8 h5 r5 p" P1 T至此,完整的语句应该是:! m0 W& B1 Q+ g' R

2 z, p0 j6 @3 I$ o2 Z

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

  1. & c3 a5 l2 }$ W* C* W4 k
  2. ####start####
    1 S/ T' A" `" ]2 h: {3 z5 n
  3. 6 E, X$ v: o) j+ F4 ]0 d3 b! I
  4. RewriteEngine On; D# w5 d( }& [/ A" ]0 z% e9 v* H
  5. - E/ \% _8 z: S9 ^5 E, u0 E
  6. RewiteBase /5 v0 s  f5 y- x$ g8 p- x' a( I
  7. . T, B) T3 g+ T2 k
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    , g/ V( B* @6 a/ e! |
  9. ( A8 B# {4 o" B: y% W
  10. RewriteCond %{REQUEST_URI} !^/blog/
    ! P9 l# u/ c5 O& w* I0 C

  11. # ]# {) J' t1 J; h7 k1 g& J& j
  12. RewriteCond %{REQUEST_FILENAME} !-f
    & O2 W/ I, n9 r" l& H
  13. 6 F) W9 Q. s" f; }# U8 x2 U7 i
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ' M; @0 E! |9 b  u+ [

  15. 1 Q% e% K1 E( W- [/ I. C4 ~  I2 \
  16. RewriteRule ^(.*)$ blog/$1
      [, C+ P" \, ?) Q5 p8 B+ M+ L0 `4 v
  17. ) h' c9 k+ A5 G
  18. # 没有输入文件名的默认到到首页
    & O: u  u* j& q2 m# m% l( n7 ?
  19. ' U6 ]- v% T: W: d- A& `
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC], e% R# K* n' j

  21. 9 P$ d" {$ w( i% {& X5 ]+ p
  22. RewriteRule ^(/)?$ blog/index.php [L]
    5 q) Y9 K2 {: T6 M8 ]
  23. + \( x8 g1 `7 w6 q) v3 W+ |
  24. ####end####
    1 l4 K: k8 f1 y7 g+ N( ^; U
复制代码

3 ^" N6 @. D2 s0 a7 |, B  u/ p$ Z4 S  T7 y0 L7 j

- E4 Q& w* w$ R/ z* {7 W" p  I9 ~/ {9 a: ?/ {6 z! V; k7 i+ M  ]

, I% u( O1 E# @% i  H* q( Q( s6 E
  w  b! k: _" N

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
7 q. d7 Q0 t3 ^" R3 |
- v  C; m0 G/ E$ B1 J5 X9 K7 _防盗链的语句,同样需要添加RewiteBase /,如下:
" I' \2 `' B; D, |) X7 n6 W
# w$ w' D: a/ D. O/ h8 D

[size=1em][size=1em]
  1. 7 T- c7 [! p  r2 }6 y4 g) P8 V" ?
  2. RewriteEngine on2 f4 m7 K' m# o( h. c

  3. 0 p+ ~; M! t) E$ P2 F! D# X7 K* N
  4. RewiteBase /
    , t$ w$ Q  P0 s
  5. 5 b* \% U8 `( `3 J
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]0 u' ?# o. q+ q

  7.   H6 [; D: g+ A3 \, u
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    ( C) j3 r, w: u. {( g. g

  9. " O+ D  t) ~4 M: U7 Z
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]0 D( h, l6 ]# Q' R# w4 z; ]1 k, t' `
复制代码
2 J8 G5 i' h) \
, N" M' N$ H4 d$ X9 M
7 c( k+ e, }& e9 R" |* r
0 E+ O7 o, h+ W8 f8 h+ a2 ^% q* U
# J8 ~. T) p7 Q2 m  ]$ L3 Z
9 w4 m$ A: Y& E! `% B  Z- i5 F

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
6 \) F! h1 B: U' `& o" y+ c6 n8 L! m% P8 J3 o6 Q
下面附上简单的语法规则和flags:
# h3 K4 Z- V& u' T( h: \/ ?【RewriteCond语法:】; |" T, A8 W* j6 F
RewriteCond TestString CondPattern [flags]
$ a0 B7 w" j2 `+ Urewritecond的其他用法:2 P- O  L. q, r: `
‘-d’(目录)) g3 d! P! W& v( `& L
将TestString视为一个路径名并测试它是否为一个存在的目录。( z4 R  C6 H# s' L3 ^: G
‘-f’(常规文件)# N8 z7 N: g9 ]( x  B: `' ?" R: k
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
! I* G2 w! b  g4 y3 c‘-s’(非空的常规文件)5 z; T7 F4 M  f4 r: g1 A
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。( K1 q* I) z8 N
‘-l’(符号连接)
7 ?" i( G  H" u* t# M( K: I将TestString视为一个路径名并测试它是否为一个存在的符号连接。
: f5 R1 M. c+ f' {3 s, A9 p! U‘-x’(可执行): z) |/ K# e$ L& z- R# ?; V
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
; h6 k8 h  \2 R- `% {‘-F’(对子请求存在的文件)$ m& v" L( A' W. V3 ]% t
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!7 v; W, {% o! X' L% ~% m) ?
‘-U’(对子请求存在的URL)$ Y/ K7 Z; ?) z! {  }: c
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
' j" K3 Q* k7 L: Y( u' I. J6 E9 R# u2 c7 S& x4 M* E9 w
【RewriteRule语法:】
$ b- g1 t& G- Z& t2 g# fRewriteRule Pattern Substitution [flags]
" }* s% |0 y) x# n- y; W! f- F
1 _: o. F+ L3 N: {【flags】:* l) X2 K! W2 y: P  x4 W$ j2 h* X! L

& W3 ]6 P4 L5 f7 ]8 Y4 H/ f‘chain|C’(链接下一规则)) I" `* K4 e- j. z/ J+ C
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
! N1 Z; m+ Y- C+ E* X1 `  s: t1 g; j' `- X
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
. G8 Z+ H" l8 ], l2 B在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。" z4 G7 f3 ]# P6 \1 t. g2 E

# U- T) d7 l% a1 o' H. q- E‘env|E=VAR:VAL’(设置环境变量)! Y' ], x# I; v" g
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
0 v, J& c3 F7 \5 H
: m" P2 u  q+ Q+ `& L- F9 t‘forbidden|F’(强制禁止URL)
) [" F8 l- q2 J' O( L强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
5 y: [1 u$ x4 Y. n! ?3 D3 ?5 e& O7 o4 H- G; q
‘gone|G’(强制废弃URL)
: S+ F% U/ ]! w, w强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
  I# v8 D# }! e6 N1 a- I3 y. T
1 f# J0 s" d6 m& h‘handler|H=Content-handler’(强制指定内容处理器)
9 Y* {; T# M7 }1 k0 B强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
8 I, x) D) C/ x; H$ X
) O) J. O3 \- N% {; T8 {‘last|L’(结尾规则)
2 N  e& m5 y- Q9 i6 s立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
1 Y2 ~5 A/ h  c  f- c/ j6 ^: a; M# Y# n7 M+ I
‘next|N’(从头再来)
( D! _/ r2 W( {. C7 W重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!2 u& E* J  C7 g* Y" M0 ^
7 ]# W  I+ p6 i, l/ X0 H
‘nocase|NC’(忽略大小写)
/ n. y- A$ x- |# Y: b它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
( r/ u4 N5 ]7 M. W3 H; s$ y" E
* d0 t$ l5 d: a* ?9 O; |1 d6 ]‘noescape|NE’(在输出中不对URI进行转义)
3 D; J" w% r# Z此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:, {3 B) i+ x8 J- U. ^
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
7 {. x0 O3 |6 M1 w7 d8 y可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
5 X$ w$ t: [9 X! T, q, G0 j9 z: \9 T  f( K3 _& j+ s8 k4 E8 D: }
‘nosubreq|NS’(不对内部子请求进行处理)- w: \1 i' B9 F
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。- ~! ~3 n" [% g6 `( V' c9 s, P" j7 v
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
, r' H* I. \+ {9 n' b9 X$ Y  S1 c! S) S4 J; K
‘proxy|P’(强制为代理)7 m# ~) t; V% [7 ^2 {
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。; S+ i3 q9 g  a1 Y9 Y4 V( }& Y
注意:要使用这个功能,必须已经启用了mod_proxy模块。
# K+ P! M8 s& F4 j2 O0 a
$ b  r3 p  ~8 ?3 ]% X, h‘passthrough|PT’(移交给下一个处理器)( r* ^! w5 W5 q7 J
此标记强制重写引擎将内部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,可以这样:
. A5 f* U! `5 r4 x* w  iRewriteRule ^/abc(.*) /def$1 [PT]
9 E2 a+ R$ P7 A# Q9 ?Alias /def /ghi  j' d9 Y8 `9 {+ `0 w) s$ |
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。8 P. f! H3 g$ `0 O) z$ O
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
# b: k) O. }0 h- F2 h9 p( U; a  j$ q, v, z3 p2 n) c  e  C
‘qsappend|QSA’(追加查询字符串)
; D' g6 \: {, x# u7 m* E% {9 ^此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
% s' Z9 d' q) g# Y1 b6 h$ ^9 v  W( a6 J2 V9 M
‘redirect|R [=code]‘(强制重定向)
1 y) B5 \& y8 Q# y' r若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
- p) D4 u: X8 h" l1 g& j注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。: G0 ?% K: P6 s# V( C$ _: l$ o2 b
. l) @6 N; J6 g9 y+ k+ h$ h1 H
’skip|S=num’(跳过后继规则)1 W; W+ V0 J: y4 D4 ~
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
# {' @+ y* b* h! b
7 p0 o9 }: ~* x( k5 T$ W‘type|T=MIME-type’(强制MIME类型)
+ x. J' e+ y7 f: Q3 k5 J4 ]强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:( X4 t/ Q: Q) M0 H. W2 R& ~! T
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
* o1 O) J- a6 s) K( U' [


# Q3 i2 t4 F+ y7 }$ y( w# |8 ^

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


1 \& A- b- Z4 }& N- y

一、防盗链功能
  ~1 R! A7 P9 b7 {8 M5 ~$ ~  _

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

  1. 4 o' o! F$ r( z' P( X* a
  2. RewriteEngine On
    $ x' h. v2 C# f4 r
  3. 5 D" o# {, w/ n' P9 c
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    ! m  }9 k, R" O) u4 X

  5. ! s, t4 g% d' b1 j
  6. RewriteCond %{HTTP_REFERER} !^$. r# Y: E1 [6 }) }6 ?7 t" J/ b
  7. & s( l- n  r- A" m1 l& J5 b
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]) Q) L1 ^$ P" p& k
复制代码

5 \8 g$ k0 y/ b. s  ?6 G& j2 x  b
1 ]) d) ~: Q9 m& h* U
* @& i- l+ z6 Y. u

% g: m  o" j4 f% @

& J7 p: k# S( B

8 j4 w& m3 p" w! {; ]

逐行讲解一下:

  C+ T2 H" Q: p, ?" @6 _) O' A5 g

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

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

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

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


6 A6 B: x- E' e/ X

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

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

7 b. A( p. h# B% @; Q

RewriteCond下:

[NC] 不分字母大小写

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

' @; m- Z/ y& @1 K" [& @0 W

RewriteRule下:

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

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

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

1 h& u6 P9 i# t( B

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
" \: x2 T( F1 {5 X3 ^

二、网址规范化

[size=1em][size=1em][size=1em]
  1. * T  z, |$ \2 l( ~. k
  2. Options +FollowSymLinks9 e  G' X+ @5 e+ ]

  3. 5 i0 K5 E: N" E6 @- A: Z7 D7 N
  4. rewriteEngine on
    3 ]1 T0 u  }3 c4 I. E. }

  5.   D7 l6 h9 c& ~
  6. rewriteCond %{http_host} ^yourdomain.com [NC]+ B' u+ Y$ l0 f  U+ T

  7. ; d% }1 z: t* j7 Q
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]  G" C; h+ s+ s! U6 ]# Z! A7 L  ?
复制代码
( F. S. c2 H# N8 w# R; v7 _2 z1 |) ~

; d4 ^, g7 m* \+ I' o; L
4 h- K, i' r5 a+ z4 G

0 @7 y* ]& K2 ~( x
: A6 r) v8 \. N' `3 D% g+ m/ ~

" ]& \% u( D/ m+ G& M! Z

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

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


% z* ]3 W9 K- l4 b) c

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

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

  1. 7 T; w$ \  {- g: _$ o- l+ w9 T& x% a) a
  2. RewriteEngine On
    6 b- U" e! m+ R" [
  3. ! g( `% z: T/ `6 k
  4. RewriteBase // v4 v. M$ V  H7 k! q

  5. 1 O- b# w3 s) D2 D  }3 @! C4 i
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)! ^) L' P' A& W. ^( K6 P8 m
  7. # R2 D; Z' N, T- x+ J# `; K
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    5 m9 ^* {  p. [% }
复制代码
4 }# N, D; @5 D! b  }0 G
- Z$ r! \( v( `
% ?) e. V" X% G( s. W/ D  q

  R3 {. ^3 E5 `* K+ H* u& `; \

2 ]4 t+ ^$ _8 {" Q! o

1.打开Rewrite功能。

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

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

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


0 b6 }& b5 [& s5 s+ E2 `$ Z

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

+ c, u3 g9 s4 G5 U( Z. g: g1 y

三、临时错误页面

" F+ m) e' b7 c  }/ C

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

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

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

  1. ' h! X: |# ]$ F  p
  2. RewriteEngine on/ t% E5 Q  U. j9 ]; T$ S
  3. + V$ [- A+ R$ w3 b. z8 y$ t
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    # f* I4 C6 N* Z* _6 v5 C

  5. 0 i9 X& e# f2 {% g6 t# Y
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.1236 h5 a* o; U2 r; M) g
  7. . }6 ^/ T, g0 i! i( A. q
  8. RewriteRule $ /error.html [R=302,L]
    . A5 [0 Y0 [+ J" l3 Y  ]+ d& g
复制代码
1 c; z! t" R2 J$ w! n* O

6 T" C9 U, ~+ d4 e* R
' O$ ~- ~. d( f( [
$ x( d4 S' C; R( ]! g
. v$ P! y+ B3 _0 T' ?* s  z
4 ~/ E. @1 U* d& X1 p

1.继续打开Rewrite功能。

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

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

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

5 I7 }% I# p" v+ @7 d# a

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

, Y5 ]4 z7 K3 E+ e

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

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

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

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


  p( w6 _$ k& e9 n( L6 e

^ 表示正则的开始

$ 表示正则的结束


5 f2 E, T4 O) B

四、重定向RSS地址到Feedburner

% i- F6 E6 k0 [% u% m; }

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

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

  1. 0 \) i4 z$ |: q( [& u
  2. RewriteEngine on
    8 p+ w* i  R4 h. C% m

  3. ) f# _! j" s8 W
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    & s7 `  o  ^/ P' ?9 r

  5. " J+ O  y2 }: l1 J; A
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]  R5 Q; q& z0 x7 P, b$ u8 S
  7. ! ~1 A/ v+ C+ p8 j2 `( t
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    + l% b! ^! P" [8 T8 Z6 a) p0 _
复制代码
( D6 i+ H$ e* h9 X+ v" i2 c
: b: u- b2 d. c; M0 p% w+ u$ f6 s
3 j; \0 f7 O& b+ G

3 a% C' f! ^) {7 n9 a2 G# ?4 D/ F2 P3 j1 t
5 q9 l4 _) O( ]/ K) f+ ~( x

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

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

: W# }, C5 \, J' L+ @% i1 L

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

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

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

7 \+ U: |( |; v+ Q8 A
  Y  B5 P; S. `4 }2 U3 M$ d6 k/ b





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2