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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:3 S3 G# r* |# ]

  c1 k& u! Q8 b# z' h# a8 V

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

  1. : Z. k2 R# c3 x  g% E: L
  2. RewriteEngine On
    & r5 v8 H& [, e7 ?6 X0 _2 V
  3. / y* j$ [5 H+ I- s! D
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$. \, A# H2 @- F- |' H$ G
  5. & [. M1 R4 y: j8 R# |0 l- |
  6. RewriteCond %{REQUEST_URI} !^/blog/# s3 V. `; _5 S5 A! ^8 J9 c
  7. ( r1 Q! D' |( P3 M/ w: o
  8. RewriteCond %{REQUEST_FILENAME} !-f0 Q" X& R' X0 k

  9. ; ^, d! K( d" ~) f$ J
  10. RewriteCond %{REQUEST_FILENAME} !-d- W; r* k' g- ~1 e& _) ?& Q: H3 C; Q
  11. 2 B8 E, o* J  f. U+ H
  12. RewriteRule ^(.*)$ /blog/$1
    9 \) R. P' ~0 t7 Z# m% m
  13. 2 r3 ^* ^; c. }+ Y- ]
  14. # 没有输入文件名的默认到到首页9 c2 ^3 d7 {- Q' H2 \
  15. 5 w. \# G8 B8 m4 m: M) `* p
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$" \7 k) ]6 m- g# \( j& H: y: X% W- v

  17. $ R# x2 O# b9 U* `1 k; |' @
  18. RewriteRule ^(/)?$ blog/index.php [L]
    + K+ Q1 a, m! x, v, e! ?
复制代码
: n4 f  ~* N& C$ ]" j, i

! V6 {* f3 Q( J
8 f+ t( P: |4 @. N: r
) u8 ]" E+ a% D# x

, ~2 m! t5 q) m' j
, q6 a0 P! Q" P- v7 ]5 E

下面我开始解说一下上面的意思:; I  a  b% E/ P1 M# d: K! \4 E

/ n1 t5 D+ l+ W; ~! d. a【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
( [% B1 X5 q% ^; Q- O* V" o. X# W3 H3 h0 r6 F4 l
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】- f: d7 X' f* M! M
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
* w6 W, v$ n  Q. ]$ u& A9 X2 P3 d8 ~
【RewriteCond %{REQUEST_URI} !^/blog/】
; U; X) u* q$ `, D3 J也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$) T- i4 R5 @, B2 `3 I
! d# [, |/ C* u
【RewriteCond %{REQUEST_FILENAME} !-f】
" z6 n2 q8 r2 E, v, Q) g+ g& q【RewriteCond %{REQUEST_FILENAME} !-d】& u: X6 V/ Z; S% v9 k& x. l# n! B
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径  |8 h6 c) m$ B8 u: K  q/ \

! z! p( u8 n$ n* v7 F, N8 {【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
" ~- O+ x* P6 Q3 z
  @# H: _: O: S% ^【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
0 v8 N; a  f# t【RewriteRule ^(/)?$ blog/index.php [L]】
+ s* A1 U* v* o. O$ X. i2 f( {这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。* o. g+ K% X5 t0 H, w

  F5 E, S, h  d* y. Q3 ?7 \6 M现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。+ ^, T7 Y, `) ^. U8 K
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:% h1 R5 N/ _/ u0 L
RewiteBase /
6 u! u9 [' v' f, Y
  o3 t# A/ M. K还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。% P6 }7 V  l) I
至此,完整的语句应该是:
5 N8 q+ L2 J7 Q; f; }
9 [4 F$ z9 U0 ~4 Q& {* S

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

  1. ' G' }- z( K3 k, O  j
  2. ####start####
    * o* c1 k7 g8 {, B% C9 P

  3. / {) y  V! S" |1 ~) r0 ]; Q, A. p
  4. RewriteEngine On
      o* ]$ Z0 R! M2 _, v% ^. U4 t& C( j# n

  5. 4 a! F$ {5 T% f5 w2 q3 b
  6. RewiteBase /* @% W3 \- @) z2 @
  7. % i. T) J) E( h0 b
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    # m9 \. A  D1 E7 k0 I: s0 ]

  9. : @2 {7 J4 a4 Y
  10. RewriteCond %{REQUEST_URI} !^/blog/$ j, O! B) l3 D3 n1 x5 T, a9 J5 X

  11. ; w4 e9 ?; W' v9 U% \# C1 _" O: n
  12. RewriteCond %{REQUEST_FILENAME} !-f
    5 r" _7 d1 A+ y+ y
  13. ' e8 T1 z0 M8 U4 ^( {- L: V) u
  14. RewriteCond %{REQUEST_FILENAME} !-d/ H0 S' Q$ U6 ~
  15. / j* f- p+ G6 j1 {6 R
  16. RewriteRule ^(.*)$ blog/$1
    + c$ E0 ]) J' u6 e4 }3 a* q
  17. ; C7 E4 K. I2 y( i8 u& ^. K
  18. # 没有输入文件名的默认到到首页* V% X. E- C. o0 E. H& o

  19. 1 r# R) X- a/ g* q1 q
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    7 Q; V; G. }* d5 c7 O% i
  21. 7 G' W: u+ y0 s: B' |. T/ ?1 o
  22. RewriteRule ^(/)?$ blog/index.php [L]) |9 H1 y; |" {) o

  23. , t# |- Q- f; P( U1 }
  24. ####end####
    + ^! H, D6 M3 p: F* L4 Q! P
复制代码
7 y2 |8 h( d) u

; {6 Y/ L8 F0 Q: H+ e
, T3 _) |. T" m1 W+ H8 Y8 ^

# \# G& q9 }4 A9 F( _+ j3 _- F. g: v

6 L! n1 H5 J4 C3 n+ {* S. {! [
! s* f. Q; g  n5 n7 _  t. J

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思7 c3 C4 r; E6 Z2 C5 B, e& I/ c
7 T9 ]% f2 \5 r/ R5 @% \
防盗链的语句,同样需要添加RewiteBase /,如下:9 l  R) c0 d. ~# E6 J1 b  ]9 |% o
. P; f2 v0 J6 h

[size=1em][size=1em]
  1. 7 B! @5 `# k! L  v0 Q1 X) y4 c4 O& e
  2. RewriteEngine on. _# P* K& K4 {) x. X

  3. , s, h- @  O4 `, L  l% l8 n* Z
  4. RewiteBase /3 |: @* e" l* `2 m# N

  5. " z' b5 u4 e$ f$ T" A0 C% t
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]( H+ q0 W) o7 a
  7. ' D* Q6 h0 P9 y1 i6 p0 ?, x8 C
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]7 i3 f* w5 U: X& t/ t! m
  9. 7 ~0 H% E; @: c! v; C: p9 f+ F
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    6 u: A! f& Y5 W+ }, b  T- a
复制代码
8 [7 A, j/ D7 u9 }
0 N  N5 X' c& l4 ^+ W0 `8 b& I

, }( Z5 W3 J1 A( d. N
' X9 o4 Z* M" g/ _5 X
2 _$ w2 k/ b" I# p/ H3 N. l

4 q. f8 y8 t: Y( O$ P. c* h1 |

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。$ x9 D3 t( f& z$ T, N: f6 S

# l8 [( H5 ^7 b下面附上简单的语法规则和flags:: t: A( G4 B, R0 `* E1 r
【RewriteCond语法:】
! z8 l. D7 G* Z: {RewriteCond TestString CondPattern [flags]4 C( {" ?5 |& z' m% g: k" o& V
rewritecond的其他用法:) y8 i$ X( V# z7 i
‘-d’(目录)' J" `9 k9 ]! D4 W" m# U- T6 d
将TestString视为一个路径名并测试它是否为一个存在的目录。. C( Q+ r* v2 a' Y. j* J
‘-f’(常规文件); c, R4 G) T; q2 R$ L  i. `
将TestString视为一个路径名并测试它是否为一个存在的常规文件。2 W1 `' I, ~0 O* K8 O: C& D
‘-s’(非空的常规文件)' [4 b7 [% B( _* |- p1 Q2 ^
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
9 b6 @/ J5 R' L1 O1 f/ W$ o& i‘-l’(符号连接)
7 \  \, ?8 ?+ @  Q: I0 g2 s将TestString视为一个路径名并测试它是否为一个存在的符号连接。
) D/ B8 q8 l- N% t‘-x’(可执行)& z' l, U4 t" `1 t6 z
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。* ~" ^9 t' K) J
‘-F’(对子请求存在的文件)
6 @2 T' Q! e6 `检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!; M, D! N/ _4 x; m
‘-U’(对子请求存在的URL)3 D5 f3 f7 |+ S: A
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!2 O" g0 n7 i  v
& J* U$ M3 B6 o+ a, w) h6 g
【RewriteRule语法:】' ?' A/ J' i  Q4 w" \5 j
RewriteRule Pattern Substitution [flags]
/ p5 e+ {3 j# H- L; Q# F8 F9 Q
( u" d2 N! q; n* O& ^【flags】:* n- [1 I  P2 k$ X
. v! k" O7 |$ J2 d
‘chain|C’(链接下一规则)
/ g5 N, r* |5 w6 \: J. v7 W( i此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。1 d, a* P4 o9 p

: q' f- w9 d4 J3 d# i+ G1 p( {$ f‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
, w7 v' c; N" H' _3 T% E在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
' ^$ f: G. _% j% A6 k! F; H! j
) K6 G- K/ i3 _‘env|E=VAR:VAL’(设置环境变量)! Y, A6 ?# V& M6 D( D3 H7 L
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
$ I2 }  w) Q, o" a; K* y2 L/ _/ J5 z" h& x% ^! y& d% b: Y1 x: w
‘forbidden|F’(强制禁止URL)! E* u+ S( s" L& T/ q9 P
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
$ V9 P$ D3 J* o) y, ?8 g/ `. R/ b1 _9 c0 W- M2 J# z
‘gone|G’(强制废弃URL)
) u2 i/ e/ d- z: t5 L9 t0 Z强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
5 J/ j( S, E9 \; e: w8 u
5 D; U: y& c5 S: v‘handler|H=Content-handler’(强制指定内容处理器)
7 _8 q+ x3 z: {* H  C强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。6 e8 ^4 ]0 B# s3 H$ \% Q
  V9 }- c4 J3 J" u  T
‘last|L’(结尾规则)
+ g7 H1 k' b+ z* _2 U8 z& t5 H$ R立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。6 c' w: O: z, c+ c6 H

7 x( R2 u" w) H2 X+ S6 p1 P3 d9 N‘next|N’(从头再来)
* t2 N$ M5 |) A6 h; L4 u重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!" J, J, N0 Z- @# j% e- u5 ^

. L' `8 `) V! y  A+ C+ u0 j; t5 _‘nocase|NC’(忽略大小写)
/ z! O/ d+ K5 \" J6 K$ N4 G它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。8 f6 z, v+ u9 h* V' F
  S! E9 B1 o) i+ R' ?( f, l7 P
‘noescape|NE’(在输出中不对URI进行转义)1 P% r# V5 |5 b
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:$ A( t8 k! \( e1 J  \4 Q. E  k% U
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
: f  r" T7 ]$ I% S/ ~可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。0 E) k% g' d) J
; i$ l' A" q! C, S3 M5 a! d
‘nosubreq|NS’(不对内部子请求进行处理)0 I) v% d- f3 U6 h2 l2 h
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。: m) e$ }8 Z2 ?- o! J
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
) }& y1 ^+ \+ z. A8 s5 @) e- X
! R: J( c, O/ o  c: [2 A4 i‘proxy|P’(强制为代理)
; @+ q' I! @. y- m9 V3 X9 o5 o此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
$ S/ L; m7 |% s5 d. z7 w注意:要使用这个功能,必须已经启用了mod_proxy模块。
. ~7 d; a" h; Z$ K/ Y* \# x6 R5 u7 x3 u, X) K' v/ i. X! A
‘passthrough|PT’(移交给下一个处理器)
# `6 M) b/ R# N! I此标记强制重写引擎将内部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,可以这样:: G0 H- L* U& J) R+ d- o
RewriteRule ^/abc(.*) /def$1 [PT]
: O  G% |! Y* O/ [2 P: F; |" {Alias /def /ghi
# B' x5 `/ z) R9 G! e6 X如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
9 s' j( F& c' u3 T2 S4 A1 R* z1 y' F5 E注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
. J& [- ~; q; S* d0 u* U6 P# X7 G8 T) R$ V' |$ c
‘qsappend|QSA’(追加查询字符串)
2 v$ [- v2 }' F' j4 u/ ~此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。" z7 _9 N% s" R# A

, L8 I. Q& ?2 `7 N+ S# r* V' F7 f‘redirect|R [=code]‘(强制重定向)- {. v9 s" B4 z* M! S& `+ t4 ^; l' K
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。) w' G9 X1 g0 s& b" ]5 b
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
, F6 f# M( c9 e6 A' D+ z; o- |7 s8 O: K" l7 u2 i, \+ Y$ U
’skip|S=num’(跳过后继规则)
( ?: a- \) o- \* w4 W9 V6 {, W( P0 h此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!- o! N1 L* {% u1 _! r$ S

8 r1 S2 L% k6 \) `  H6 t‘type|T=MIME-type’(强制MIME类型)
, H) Z* s) f' u$ L强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:" Q) Z1 {7 c( f" {0 A+ C# Q6 V" S
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
! |0 V/ M" _8 A- M9 g& S



! a* a2 I- w. h6 [0 Y

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

* g8 c. D6 a$ ^: C: W+ p; K

一、防盗链功能3 m' l. B1 E( h" Y' c/ I( r- w

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

  1. ( B# {  a/ K, H& k7 Z7 K
  2. RewriteEngine On
    8 I% ^' D8 m6 t
  3.   J) ~" \: d) h/ [; w
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]1 N5 N% ?3 W. {+ \9 n# d' X6 K4 A
  5. $ y+ U) l! ]! k. V4 X0 p
  6. RewriteCond %{HTTP_REFERER} !^$
    , C1 I. Y% n( i( o
  7. , Y3 |7 p5 b  R( O- l0 Z6 y
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]" W) r2 H7 Q* L9 q5 |2 v' h) b) z
复制代码
$ F7 B1 [, g" e

5 L5 ^' h8 E( R/ p8 L! d! c
  D; t9 f  U$ W' u

1 Z/ i: Y+ c. A8 D. c

6 i7 [$ j, A0 M4 @* p5 n! B* b/ W

$ u2 N4 ]9 P8 ^! }( G1 N# o# y

逐行讲解一下:


% S  y5 C9 d9 r

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

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

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

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

! _7 L( }" E. j

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

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

1 X+ A! {8 P& o' X1 m4 \# \

RewriteCond下:

[NC] 不分字母大小写

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


' Y9 H% N+ Y/ l# Y

RewriteRule下:

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

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

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

. H6 B; w# F/ _; b! @$ E2 P

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
% t+ C1 ^5 c* j# w  a2 B% U8 Z

二、网址规范化

[size=1em][size=1em][size=1em]
  1. 9 B& _$ u; b( \& ^1 ~6 Z+ k4 [$ V
  2. Options +FollowSymLinks
    ' \% C) {0 N' R3 e  ]

  3. * G4 F# J/ h+ v$ [$ G! i
  4. rewriteEngine on
    8 s# H2 p3 t2 W: V
  5. # i* H1 `* V- [; R0 v, W
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    - ~' k4 e: z" Z" }4 j3 a

  7. ! l4 s, @7 i* R' N0 G  R
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    $ @; L, g7 K9 r% {  z
复制代码

( E0 \; i: i* B* y1 J
( Q8 Q1 Z* d6 o
" H1 Z# @6 F' b9 Y) Q* l
, N0 v0 _4 `2 O1 N/ i

* ~* n0 }3 z# V) H/ p- O: i' B8 q
2 m6 u! [' T6 P7 Z

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

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


! |! v7 K2 j$ H

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

[size=1em][size=1em][size=1em]
  1. 8 K: l) e  e# d$ z, T
  2. RewriteEngine On$ e1 `& m6 m, b

  3. $ W: x, G1 @3 y- a
  4. RewriteBase /
    8 v8 R. |) L: X/ D, C2 t9 f
  5. ! S) }1 D5 u* B8 F
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot). s+ e  e: l5 q$ `
  7. , U& I! N9 c' F- x& A+ z* N/ \, c+ q) ]
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    3 m2 L* m5 r$ {8 ]1 Q% }& K% [
复制代码

0 I7 c9 A( l/ i6 n) z, E! D4 N+ J& o, D  L% H
1 z- F  ]6 l/ T* D; R- Z. i4 |
0 k5 D' Q1 Y: p, U

) W( c  A% A0 q( k& N8 e: O4 S: m+ I. J/ L" t* \

1.打开Rewrite功能。

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

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

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

& h" w* P9 V9 B% W# e% H

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


' @: g' Y3 {5 r! f

三、临时错误页面

$ N2 D- ?+ K- U

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

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

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

  1. ' c* u% `. g4 ~
  2. RewriteEngine on
    ' M+ V4 p! m* y6 i) @) w. y
  3. 4 }: y! f3 B* w: H1 C
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    ( q2 s0 X) Y2 ]6 D5 S

  5.   l8 K2 `! v) l; A1 M4 L
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
      s1 Z$ ?" |( s# N* N" l( Z, ]

  7. . v7 i" Y; t( q
  8. RewriteRule $ /error.html [R=302,L]* t# M5 j* }. X% N5 m8 b( n
复制代码
8 o& ?2 C: |8 I8 V* ^# J% ]

3 ~  D0 A0 ?% Q& z0 x
8 a- P3 E  [# X( H

5 Z$ f/ a, ^. \! z$ v* N+ L5 m8 }+ V  b
1 W- ]7 u2 W8 ?0 D2 w+ Y- }

1.继续打开Rewrite功能。

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

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

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


* B# e+ k7 Y1 P# s& }

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

" \* w/ I4 g- o/ H; y

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

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

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

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

. }* W+ A9 w; o9 i& M* s+ V/ h

^ 表示正则的开始

$ 表示正则的结束

# @6 y8 e" u" \7 l- B

四、重定向RSS地址到Feedburner

1 [) Y9 Q3 w; m) w7 H

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

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

  1. # Q" o& ^7 ^. Y, g& S0 W
  2. RewriteEngine on( N* E. L7 }( Z* |$ u0 S4 ?
  3. * g$ G' n% w( f) n2 \' c
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]5 k& t7 o! X) c) d! h4 A8 O6 |
  5. ; ?2 {/ N# y: p0 h+ T
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]3 S- }) O: r+ L
  7. 8 U, Q, ^# c6 n
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    8 a/ F) B1 Z! t2 j
复制代码
9 @1 K! S! [  \1 P" ~
7 ?3 }- |9 s# y/ x
- i- J" ^8 H6 H4 G; C  S& @
3 W$ R/ i1 T+ S5 G
6 P. K: h0 s) J+ X7 y7 _

/ n% E) g2 y+ D; a  \

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

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


6 u; I9 u1 ]: ]$ u* T& L2 @

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

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

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


) M' c' E  h5 w6 W1 t, e* l3 s6 t- f
9 d4 N3 ?6 @3 k! [. i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 15:42 , Processed in 0.139175 second(s), 20 queries .

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