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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:2 e0 `; |; b4 y- E

* Y0 y9 j+ x8 V' B$ s

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

  1. ) [% W3 R5 D: C  o, U* u4 Y" Q
  2. RewriteEngine On7 o; [% O/ _, Y6 I% L0 a
  3. 9 [% H8 E: \& `' L
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$, t5 C9 u3 L( [2 f0 H) Z

  5. + \7 W% [/ U+ S4 p
  6. RewriteCond %{REQUEST_URI} !^/blog/
    ! q% }5 `* p% r
  7. * H$ I) l* l! C) e$ O! S
  8. RewriteCond %{REQUEST_FILENAME} !-f, F2 C% Y+ J5 M; u: L( w

  9. 9 l* Y9 [; d% D8 E/ j, U
  10. RewriteCond %{REQUEST_FILENAME} !-d* T' @0 I. O+ ~* K% |# ~0 X4 J
  11. 0 {) |0 X( F8 i% ~6 S/ k( O1 X
  12. RewriteRule ^(.*)$ /blog/$1
    7 B- q8 L, q+ [9 X* s) ~

  13. 4 l9 F9 z  E6 N" ?
  14. # 没有输入文件名的默认到到首页  d/ m& p. r! f, H0 e3 y- H
  15. 3 n0 F! V: V5 \% q
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    7 A  T5 k  u* T+ p& L
  17. ; I, A% `# D$ n0 ^1 ?* X. w5 [( B
  18. RewriteRule ^(/)?$ blog/index.php [L]6 ~' S: R2 u: D4 r9 c1 c! C. z
复制代码
* u3 O0 m8 f2 L4 G

- F3 B2 D7 x1 }  z- D5 \

" u& y& E- v: w' D6 E7 }7 T; C$ y  m0 M) L( T% {1 [
/ J2 h" q9 V, Y2 ]" G1 c

& Z1 O9 _/ F9 _2 n& Q* @

下面我开始解说一下上面的意思:/ B( Z) n: `* v$ s: r! K8 X
* y$ k6 S+ S6 D6 a, ]1 ^2 ^+ G: {
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。& I1 L1 j6 d& P) B
' k8 M  x9 @6 ^: p0 D& |; l) ~  z$ [
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
. _% S9 q3 O) M8 K5 ]这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
" ]+ K) ^  x1 V; E5 ]1 \8 i! H1 T0 u3 p( p* {% h9 H- ^3 H' w
【RewriteCond %{REQUEST_URI} !^/blog/】
, l/ Q) j7 K! E) M$ i1 r也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$/ ~4 G8 a) r7 d, Z) n

# t' G, w( ^- e0 ?【RewriteCond %{REQUEST_FILENAME} !-f】
( o+ }4 b' Z2 C( L. S& l【RewriteCond %{REQUEST_FILENAME} !-d】: v; j$ w7 P, Z" Y6 r
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
) w; D) d# Q) \2 D1 u4 n, N. p: k3 p' h+ H% n
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
% U4 ?0 Y# [8 B5 ]$ a, H+ b) Q
" W) N  i# x+ j% N【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
) h% x) b3 u, s7 o0 M【RewriteRule ^(/)?$ blog/index.php [L]】! r9 r2 E4 p6 n3 _+ ?' P
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
  H. d( l* z% X$ t! p9 P" e, d7 ]% q# N6 X' B
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。  k5 P; }) T9 o7 ~1 C/ `5 v
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:8 i, q5 U! [# H& A: g
RewiteBase /
- _  |* }- s& u5 ~& K3 Q! a2 |" T+ t* M! x) `- h
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。9 {9 v6 [4 d0 J
至此,完整的语句应该是:; c5 C1 g; m9 G) M0 ]# {

' X: ]0 r6 V" E% O5 K/ G; r

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

  1. ) k1 Y. s! l  O: a5 _. ^: G
  2. ####start####9 A$ ]5 ^2 _: K- A+ [5 ~- T
  3. 5 t8 B# S" Z2 P' `6 o$ J
  4. RewriteEngine On4 a+ W- N& @. V" @0 f) m9 \

  5. & g2 x/ X" g+ M& o) j
  6. RewiteBase /7 D% W3 ^. D* D! V( k0 M! P) o

  7. - q4 I# y; R+ _
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]$ ~- ^" G3 }- ^
  9. : v8 f) d9 L( E" g+ \4 E. H
  10. RewriteCond %{REQUEST_URI} !^/blog/* S7 ?! g" Y/ g  d' g& n6 W

  11. & N9 ~3 p# s/ c" C3 M
  12. RewriteCond %{REQUEST_FILENAME} !-f
    & J3 B; F' d9 H1 Z4 i
  13. ( _; ~/ h( o$ l7 r& L0 L+ i
  14. RewriteCond %{REQUEST_FILENAME} !-d
    0 G' N1 S5 C9 A* s9 j+ ?+ ?+ B

  15. 0 k! H! r: S$ a7 I& B
  16. RewriteRule ^(.*)$ blog/$1
    . p' @, O$ r7 Y8 a- q2 p

  17. " [+ B  ~$ ^/ ^3 j
  18. # 没有输入文件名的默认到到首页
    + _- C) W2 _/ y
  19. % l# m3 I- p; T
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
      L* F  o/ [/ G  l/ j! W

  21. 0 v5 b9 j( D, N( U
  22. RewriteRule ^(/)?$ blog/index.php [L]
    & |0 l' _' F& c3 G3 G

  23.   }7 u$ ]( t5 r, B0 q* j* K$ ?4 y, e+ Z
  24. ####end####
    , j5 i6 M( X* @/ u  a
复制代码
. K2 T' ~# w% R, N0 A3 K

6 \' D+ N* N- \6 u, k* r' |
  h) _& d1 @$ E; |! O! a% ~3 J; C
& D9 M. S) \, k# Q. C7 L& q1 b

9 l+ O3 [" M' t( t9 H/ S

' N, t5 o$ z* j* x- k

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
2 e$ L. x+ M! x  m$ ^* c' Q+ X3 a
防盗链的语句,同样需要添加RewiteBase /,如下:
8 R% N$ D) i" @: L  L" k
4 n8 `, o8 [# |# h0 S" r; C- V" G8 l

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

  1. 2 u# d0 O2 G5 g
  2. RewriteEngine on* {$ a! P4 I: H$ O! {4 @
  3. 3 d2 J' t3 V; m$ Z! L: d+ d
  4. RewiteBase /
    / G* c9 b& ^  W/ }' Y$ `

  5.   k# y6 C0 G3 F0 M* D2 L' n  A
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]+ G6 x0 C: L9 ~  [. d) `" h* f8 L

  7. % h5 B: Q. g/ E- H2 o5 Y
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    ) ]( N. P5 ]9 @' l
  9. 4 S$ g% q* E0 Y& m9 v
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    + f; [  u+ G3 U
复制代码

* G" }& ?( D$ i0 \( c% `3 u# U' E1 c# O/ D7 Q

: M& ]/ k7 ~4 E* ^& l/ z! y  p& l4 j6 Q0 f' Y: \; S5 |) N

  l9 E! e$ x+ w, D* K5 c7 F) z3 U
& r; e" D0 N5 k8 O

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。& O% n- G7 M- i7 v- Q4 d  ~1 n

7 [% k2 J! i" ]$ T' `: L下面附上简单的语法规则和flags:
/ j& P& H  a( |* a【RewriteCond语法:】
# j( t/ F0 G  z9 ]% FRewriteCond TestString CondPattern [flags]( p1 I/ ~. t0 e. Y$ v0 S2 K: a
rewritecond的其他用法:
2 G9 P" _6 i( g. J8 x‘-d’(目录)
3 `1 W. K1 [5 w6 G$ h# I. l& J2 j将TestString视为一个路径名并测试它是否为一个存在的目录。( S3 O  R' }) i" F
‘-f’(常规文件)( `3 P8 x9 i( N9 x3 b
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
6 n9 _, F# @/ j6 L' n‘-s’(非空的常规文件)
7 w. H+ `: E9 }2 l2 z# T将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。& E# i! S  r& D& |; \
‘-l’(符号连接)! O% d& \$ L- E+ J4 @$ Y5 K1 u
将TestString视为一个路径名并测试它是否为一个存在的符号连接。. W. I& \" a2 C" e) ~3 g
‘-x’(可执行)
+ N( z8 E4 a- f) B: a! P将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。* W' J! c& ?# m  d& f! O" G% ^
‘-F’(对子请求存在的文件)
1 a- p  W, x: ]0 g' r7 Z检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
# X0 u( u8 a6 Z. Z3 I! @‘-U’(对子请求存在的URL)* ]5 v# |) U9 W7 X
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!1 A! v* C/ l- n( _; Q
. I' W0 h. l& |- I% Z! K
【RewriteRule语法:】
8 V& ^0 f, o# l( l6 s  aRewriteRule Pattern Substitution [flags]1 J& k: {& [, e4 ]; w, _
8 _$ Q; K1 P/ y0 |
【flags】:
" x0 ], v% `- Q' w+ x# ^! ]% u
3 E8 v' s+ m+ B‘chain|C’(链接下一规则)
. A9 q7 F& D  j9 t1 w5 I% k4 ^此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。$ A- ~) W9 {) n/ l

% r4 s7 l- k2 a6 Z; o& b‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
0 C  D  S. \: q% @: o8 f在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。. w! `0 o+ ?3 m4 A

+ v: [0 G! Y8 y‘env|E=VAR:VAL’(设置环境变量)
: [+ p! j7 q8 m) G此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。7 v. [/ d% Q5 x

- }+ e# C9 x2 n) P7 z/ I" z( n‘forbidden|F’(强制禁止URL)# J+ X. e4 q# Q. E) h. j5 H
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
$ M# P' m1 d1 p; h2 h" b6 y5 a/ z5 J9 v) i3 o, `) }, j! e
‘gone|G’(强制废弃URL)
) \& P6 }0 m, q4 M) _  x" K强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
! S: W7 x) Z/ H4 i
' t9 V2 _6 ^8 {5 E‘handler|H=Content-handler’(强制指定内容处理器)- h1 W4 O' s8 |2 @  u& @
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。3 i/ B/ j) H( h6 i3 I
& @7 H3 ~4 W  b6 O) C# I8 _0 Y8 S$ g( D
‘last|L’(结尾规则)! X8 w, F+ v! l5 ^% V/ J$ w
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。; q" W+ s# ?( H# B; l% Z- D5 ^( r

8 \: _0 t$ ^1 V+ n/ @$ {1 E0 M2 H  m. ?‘next|N’(从头再来)" m# O  {% A! x3 N
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
( Y1 s& E% n4 W* c/ K2 ~
4 J9 _* L7 `$ @' m" B$ K‘nocase|NC’(忽略大小写)/ H+ q: Q3 M4 t* r
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
; m7 g) e7 x. k, ^) m1 L: I* `% K# l. O/ K& ^4 j' U. X+ g
‘noescape|NE’(在输出中不对URI进行转义)9 _2 w1 Q/ |1 y- Z
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:3 f! t+ ~% c9 K% _" E
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
7 E8 k' k  a9 I# ]/ m+ |可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。5 U0 y  i  e8 ?# r: j

: a- z2 \4 K& r8 x4 w3 m/ B‘nosubreq|NS’(不对内部子请求进行处理)
" M. r/ k+ x* O) R在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。1 i, ?' ?3 l! q" o  L7 F& u
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。% n- p0 K6 h" P# K
1 |3 l+ x+ N8 A
‘proxy|P’(强制为代理)! \! a: _! N: d/ y
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。1 S9 l/ F/ T% D: q3 _; X1 M
注意:要使用这个功能,必须已经启用了mod_proxy模块。+ L( c8 x# c$ O) u. b* G
. T  Q5 H5 c/ U3 D& q  @( F" H" Z
‘passthrough|PT’(移交给下一个处理器)
1 {) P, O4 ~' Q3 q9 t此标记强制重写引擎将内部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,可以这样:" j# M( L% }. T  `
RewriteRule ^/abc(.*) /def$1 [PT]
# Y5 }, ^3 l  s5 J, H# o9 P6 G, c1 hAlias /def /ghi
' _9 P( u$ v) q$ o如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。* n4 c" f& S- A
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
+ C6 O9 p% |( H4 L% m/ |$ y( a0 q* C, e) B0 x& f" }: s8 I' {: f
‘qsappend|QSA’(追加查询字符串)
1 F- p6 ^& \* w# B9 Z( t, u此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。7 J/ j) n/ P$ l; ]

* d) ]0 T9 [% u! m$ B! A. ^* L‘redirect|R [=code]‘(强制重定向)! X  z; ]  b8 }" k
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。9 o, ]; E! E9 q
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
7 C7 }- |5 E5 C( F- I
( `- y# `0 E$ t$ a5 Y% ]’skip|S=num’(跳过后继规则)+ Q- u- S' a. e1 F* {4 G' q. O! g
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!7 A; o  b( n/ G% {: W

" Z" P0 R( |2 A0 r& P) G‘type|T=MIME-type’(强制MIME类型)
' ]2 P2 r& k. @8 ]( J强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
& o' A5 w& x( d. U! n+ ?+ URewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]+ u5 v# |) a; @- \9 R+ s


8 u: I# i$ _2 R0 u. z/ r+ R

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


5 ?/ J) V5 G# ~# w

一、防盗链功能
1 K* _, ?4 b7 k5 S: t  C) w1 x  a

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

  1. ( q8 f' |, [2 x; b
  2. RewriteEngine On
    7 l0 l1 h1 Q( H# Z% M

  3. : S: h2 p: V% Q  o  i
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    , R* P' X+ u. d! I& N! F7 ~
  5. 5 x# {) {! K  ^, r6 l" g
  6. RewriteCond %{HTTP_REFERER} !^$; T& E7 h+ S, }! f" P

  7. ) Y4 I( I6 P- `4 ~  m$ k
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]& j' m( ]& t6 Y( L2 C7 O6 M. ~4 m
复制代码

9 `+ V- }% U$ N3 \. {. p" ~
% }5 S1 I! K# {: }, n& q

4 z! o$ l3 F( k0 z+ ]* d
. j  s- ?9 ]2 D( d2 @8 E% p

0 x' N; U1 h- x5 W- x  s1 y+ F

7 B+ C1 x# X7 _  h; v

逐行讲解一下:


& K+ n+ G; C: i4 |! q

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

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

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

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


# F  C5 A3 _6 d6 t6 |9 k: J

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

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


' }& S+ z' A& Q! x

RewriteCond下:

[NC] 不分字母大小写

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

2 z, }3 w8 _2 _, b( M2 c

RewriteRule下:

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

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

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

+ m* z% ?$ _0 s4 v. ]# M9 F! v

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
6 }: N+ v& ]3 j6 k

二、网址规范化

[size=1em][size=1em][size=1em]
  1. ( h4 k& l' _- \1 I) M5 V
  2. Options +FollowSymLinks
    , f6 s( V! X1 w2 z; N- _
  3. , B4 A/ b  M; p1 _0 e8 t
  4. rewriteEngine on
    9 u5 o. l0 H! h2 S9 |& T5 V. j% A
  5. 9 Y$ w, ~) _. a
  6. rewriteCond %{http_host} ^yourdomain.com [NC]8 X) E4 C% U7 v/ l

  7. 2 S, f, y: `  S- M6 t; B
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]0 n7 S6 K0 v3 r3 I! R. b, c
复制代码
. b1 C" N9 K- P' n* c) v

2 M6 f9 \& s/ M3 n) t
& ~; U: \' P6 r0 @1 g, G
' {$ Y5 V4 |2 V$ I

% M- c+ m& D4 Y4 F
6 n! o/ H/ a: h1 C2 R

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

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

6 W3 [- @- p" _2 t% R) L

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

[size=1em][size=1em][size=1em]
  1. + q; y$ |+ o1 A+ b. v
  2. RewriteEngine On0 b/ N1 }7 ^  I8 t

  3. # G7 R- r7 o- _! p
  4. RewriteBase /; j. o' j4 S; V, B/ _$ u
  5. 0 v) E  f1 W$ G! ^- b4 t% `: R
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    7 ^) z. n7 s" _' G+ S, ~4 D3 E

  7. $ Q% }1 ~* u4 J
  8. RewriteRule ^ http://abc.com/ [R=301,L]4 n0 W% D. }. O  G. q+ @; u
复制代码

; v# o0 J$ o# j' `
$ k( @" R$ h. j1 ~9 T
' t2 h: K, w' D3 C" _
, V5 t; S: I/ q! y5 a, N) `/ A, z

8 ~% z, e0 z- l2 ?
2 h- Y3 X$ q0 f" q

1.打开Rewrite功能。

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

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

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


  ^; @; `+ v6 V

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

0 Z: {5 l" u8 G4 P& s

三、临时错误页面

+ L- C3 W; ?0 L

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

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

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

  1. 3 M' A9 O+ H" `2 K: g+ k8 C
  2. RewriteEngine on1 @5 Z( v/ g; K+ D# R6 \' F/ b

  3. 2 Q4 H3 h* r- O0 Z& e9 U9 [
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    $ r3 a+ z* r, r; z7 X1 \

  5. + u8 S( K% }8 l+ i: g
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    ; Z; x. K% ^; ^4 v( }& Q/ }# Z

  7. 6 C- L9 V7 }# t( ?
  8. RewriteRule $ /error.html [R=302,L]" N+ p5 b+ O8 f+ V' i0 t" [4 u& S
复制代码

+ _# l1 Q4 k' v) O4 x4 B2 Z; o: G7 U0 r( |7 r  {5 a4 ?4 E
( _, p' R* M/ A
: a. ~. e; `. Y. |/ R& c

7 d$ s# P4 e% n2 z/ \, b1 m' B, ?. h5 x6 j1 B- x/ ^2 u( e+ ~

1.继续打开Rewrite功能。

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

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

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

# r( q4 \, j: X

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


' J3 Z0 a8 C" \  d/ U) C0 {$ f" A

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

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

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

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

1 |% |& F( c; [% P

^ 表示正则的开始

$ 表示正则的结束


" o' P, u/ Z3 m' {

四、重定向RSS地址到Feedburner

, U8 i5 U9 U1 a' d/ k6 J

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

[size=1em][size=1em][size=1em]
  1. 4 X% p, ]" a( K6 U
  2. RewriteEngine on7 T" x' c0 J; f% R. F+ k0 B
  3. 9 W: F' J/ |% I& o& I
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    - e2 n( }! \4 P; U/ k4 z$ i' w+ t

  5. 0 }# m! [& g( G" A# K( \
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    2 [5 i, i" c9 k) n) t3 `
  7. ' a7 I  i( ^6 R' [$ V- z+ P
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    * I1 G6 o# T, R6 e/ r' [
复制代码
7 J5 k0 t( E0 J: P' f, H3 M
8 G% b9 W3 Z: F1 ?0 {

8 B0 _$ s9 b2 @: e4 H4 \( ~
1 W5 [6 j3 b. G5 c4 j
1 O# V) k7 b9 C- @3 O8 \
) D, k+ \( C0 x+ j3 b, i

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

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


7 e- \  v2 @* a9 o9 n

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

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

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


# B& l; b5 R6 d! R) H; h1 U
: f8 B4 W9 |. L% R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:12 , Processed in 0.061262 second(s), 19 queries .

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