cncml手绘网

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

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

.htaccess中的apache rewrite写法:
: D" r2 `4 f! @1 q9 E5 o. D
: S9 m2 d6 v% D/ k$ t9 D

[size=1em][size=1em]
  1. ! R5 Q+ h6 }& B5 M
  2. RewriteEngine On
    ; j) l4 e8 T% t3 y
  3. ) ]5 J$ i' T, u
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$4 V" n, Y, t* w: z+ b  ]  w+ z
  5. ) `2 I  w& H* o1 I3 u% l, c1 X3 p
  6. RewriteCond %{REQUEST_URI} !^/blog/
    3 ?4 J9 u! k: n2 r3 j
  7. " e8 |$ C  P# f5 V% d) Y
  8. RewriteCond %{REQUEST_FILENAME} !-f
    ) Z1 \; }2 l* ]5 l

  9. 8 s; c' E: f8 Q# N4 i
  10. RewriteCond %{REQUEST_FILENAME} !-d- n9 O6 T: L) m3 u5 O) O8 i- E
  11. $ J' \9 v6 x. d% W5 a5 a/ k! ~
  12. RewriteRule ^(.*)$ /blog/$1
    ) A3 B: l5 U- h. K" p

  13. . O( O7 i8 p- `2 b
  14. # 没有输入文件名的默认到到首页0 I' C+ ?1 d" w- ]6 F4 S# ^
  15. 9 H+ f( m6 H$ G- d6 c9 ?4 R3 n
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
      {  L3 h; z, W1 X( }) y2 r/ h

  17. , n/ q3 Z* j+ F2 ?6 X
  18. RewriteRule ^(/)?$ blog/index.php [L]
    # p/ g& Y* u. v! }
复制代码
3 {  ], C  y: A4 u0 h* \" {* Y

( Y6 u/ R  D5 t% u

' z& S6 ~, y' V, Z. j' N4 r$ ], G+ M5 U+ [5 J( A) ?
4 d. D! n% s, f
" p7 j% n% I' U1 |% d. p8 F( s

下面我开始解说一下上面的意思:
: p! ^0 H- l# N4 s3 }( b2 f2 {' _$ l, w( Q6 P+ D5 ~" N5 h0 B8 N
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
! Y+ h6 U7 d3 R2 a' Z& r2 f& {* K8 ?( k9 S
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
: F3 l3 M- a  `2 M5 i( h1 G这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。7 P+ X3 b% ?9 ?' |- ]+ E8 n3 G5 z
4 }1 [. ]$ g; l7 I5 U% y/ Z
【RewriteCond %{REQUEST_URI} !^/blog/】
& v( V( i8 m) Q# b7 h, ?也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
/ y  W. ^0 ~  b2 u5 C9 U% H  Z
& p+ e/ u. o0 q/ b) P【RewriteCond %{REQUEST_FILENAME} !-f】$ D% l' v9 C; _! g% R
【RewriteCond %{REQUEST_FILENAME} !-d】: F7 C/ h% s: A2 z2 J
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
! z2 S# V, V0 d' n0 P4 g1 f4 Z( C) p/ P3 t) L6 d
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
# L4 J) o# b4 W. I
1 w4 R2 G% P# n7 E$ k6 m' [$ w【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
' F6 L7 @# g. A【RewriteRule ^(/)?$ blog/index.php [L]】
6 C. U$ p, B# \! f9 t: q& i' F这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。* @& Q; x2 C1 ]9 h- S& p
% }+ h9 d  S2 [# i" E
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。3 Q4 a8 s- p  w- W
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
4 `8 {% P) {4 |" A" B9 v# w! jRewiteBase /9 R$ T, R' t0 A5 e9 Y  g

* Y7 Q8 q7 e# o# m3 x( `7 Y5 L0 [& j还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。6 E+ l9 p9 z* [+ j
至此,完整的语句应该是:# a) B7 N; q4 I% W: f. ]9 D

# r! Y2 O: F4 p% ]' O

[size=1em][size=1em]
  1. ( v3 c# R6 j, i2 V0 I8 s8 d. B9 l
  2. ####start####
    ! F8 K! a- Z. M! s
  3. ! }7 R1 g  U: N
  4. RewriteEngine On
    3 [  J5 p. i; w
  5. ) H7 d% N  [% {8 _( o
  6. RewiteBase /& D8 O9 `% r6 t3 ~. x# I: P

  7. , G- k5 c4 Z0 ^* D% k' b  l5 X- F
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]( m, x; F/ ~$ U1 V+ Y
  9. 9 U4 T# T4 B5 v2 t; q7 h& H
  10. RewriteCond %{REQUEST_URI} !^/blog/
    $ J, A4 X0 v/ d! q
  11.   c3 o% e9 _' }* w# |" z3 h- x! Z
  12. RewriteCond %{REQUEST_FILENAME} !-f: Y' T/ R' B! Y# Z# B  s9 ~2 @
  13. 7 N( z, t: W# l& T* _+ {8 C
  14. RewriteCond %{REQUEST_FILENAME} !-d& \! A; r  U/ a! `

  15. - h) O" r6 y$ a/ d- }
  16. RewriteRule ^(.*)$ blog/$1
    - R; C; w! t( m: t* V

  17. " b1 |2 Y1 B' e( l0 h
  18. # 没有输入文件名的默认到到首页
    9 g0 s' k. [; L' w

  19. ( Y2 X0 Z: O! G
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]+ b4 r) i/ e) ^9 V2 b  M& U

  21.   |7 U, u3 }$ d- p# F
  22. RewriteRule ^(/)?$ blog/index.php [L]7 |& [9 c/ k7 j6 Y; m, v* L
  23. 7 i) m# U$ l7 ]" Q! _, w+ R
  24. ####end####; u5 N( p4 ?4 r/ R  p
复制代码

$ v: J6 `+ z& ?) H" \) G& ]
2 k; y$ ?8 }+ `$ ^2 Y! w. C
/ O0 A* Q) N& h9 ]3 `' _

7 T6 @- m6 S) E. K" }6 R; ?( e& {

* Y- ^( R2 J3 S

0 o1 |" L& |; y; H

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
& T; ], O' l* }" D1 z8 J3 t. Z$ }. s, N, y/ k4 V1 E) u
防盗链的语句,同样需要添加RewiteBase /,如下:* p: c) p) r% u& s( }0 ~

; B- m% t( S; ]% T3 N8 ]

[size=1em][size=1em]
  1. 4 k. T  Q! l! L9 l. j
  2. RewriteEngine on: j, P; h! r6 z3 r
  3. ' Z1 ?& F. ^1 K. A
  4. RewiteBase /
    4 H# y# b9 v' o0 _3 ]3 S6 h

  5. ! Z7 f. I$ ?! u/ x6 a
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    2 w& t  o/ K* S( ]) I
  7. 6 J% s4 Z; D: A( g8 U3 c
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    , k9 X2 t& N0 z+ u+ t" J
  9. : F; E* }5 v" t  X+ Y1 |
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    / v' |1 c6 }: G4 p
复制代码
0 N- E3 C! o. G. ~2 ]

+ W* `& w9 [2 w2 @1 k+ Q  D

: z% M3 y8 L3 E0 M- z, D8 ~$ @
7 i: J$ F" C) }7 n* j
5 E6 C1 |: K0 @7 f
2 P; G8 U( c. P) z

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。7 G' U# Y0 ]( ?7 a: y

4 I8 u4 k* S' {# p/ Z) U下面附上简单的语法规则和flags:
% N8 c- O/ j$ n, \【RewriteCond语法:】
$ M8 u$ V* t- q3 [9 `3 mRewriteCond TestString CondPattern [flags]2 g  m! ]3 ]+ W8 A. ^
rewritecond的其他用法:
! ^7 }9 i& o1 C/ Z1 e‘-d’(目录)( h5 {  u0 z. ]3 `
将TestString视为一个路径名并测试它是否为一个存在的目录。
4 ^3 }( p. Q. i$ D# d‘-f’(常规文件)
" Z1 T" T/ O; c+ _3 E( t6 u) L将TestString视为一个路径名并测试它是否为一个存在的常规文件。1 y* f" \9 s" x  V$ |% b8 [$ k2 D
‘-s’(非空的常规文件)
1 e: D, F, s  f& n% x将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。1 H8 W  l3 g( m) n7 u; ~0 ]' o
‘-l’(符号连接)
) z, m! g5 |) X( J' h1 m, Q6 n将TestString视为一个路径名并测试它是否为一个存在的符号连接。
8 F. m- d& Y) W& `& O. I‘-x’(可执行), @+ _* `/ p5 }5 d
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
* m: M7 \* _2 Q' q, u' N" ]‘-F’(对子请求存在的文件)4 M% J- g2 Z# Y- w
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
, t+ e0 b  c- f9 K4 T/ N‘-U’(对子请求存在的URL)
8 ~7 s( |# h3 E4 p检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!' e0 j" e  P* T: C" _% q
+ b9 n8 h6 ^9 g; b% X+ N
【RewriteRule语法:】
9 u7 s  a- k, T% l. R0 J3 E* P) E; IRewriteRule Pattern Substitution [flags]/ p8 u0 V7 }5 S
: c, H" s; Z2 i8 m- _( |
【flags】:
/ `' Q  [* q7 S+ n( C5 U8 ?* g8 ~, i1 U1 A0 c7 N8 b  s
‘chain|C’(链接下一规则), n3 u% a( L" h3 H$ g
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
3 Q4 f3 q$ N  h% O. O+ V
0 }! D& r4 R3 ]9 Q/ i2 p‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)5 n& z" C% A6 @2 ~+ {
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。' K" m7 U- M0 T7 ]) ?& J: g- C
/ c6 X; ^3 W3 e9 i! m! C( S% p; W
‘env|E=VAR:VAL’(设置环境变量)
$ i: V; L2 L, R& o, s此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。/ y4 f% {) ^( n0 p1 K
1 P7 Y& j6 _5 i. V. I1 X
‘forbidden|F’(强制禁止URL)
' |  V) B# _0 J# x$ R! {强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
# w: O- A/ D% `8 v7 X, p" x8 S/ U2 Q0 h' s% I
‘gone|G’(强制废弃URL)+ X: u/ C( R. W2 S1 Q. `: `
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。. Z+ i6 x: w  c" C6 {8 K+ S1 T

  o5 n2 H4 d* x/ U  Z‘handler|H=Content-handler’(强制指定内容处理器)0 D) S# ~- z6 q2 ]
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
$ k: }: q3 f6 U' _. d6 h0 P  I( r6 Z
‘last|L’(结尾规则)
! R* c7 k4 G) f! j2 ]; m' G, L立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
7 m6 ]; ~" H8 H
% L* V3 C' K4 D$ n  }) V6 ?. y+ c‘next|N’(从头再来)
! R2 N2 @3 o( @! X9 X- N重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
' j$ Z- G0 @8 u
5 I. s- C( q) z, K: p‘nocase|NC’(忽略大小写)' A! C! r' n1 s3 @( I1 R) g
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
# n+ k% p6 i. N) ?; ?. m3 g9 z8 g$ N1 ]5 C$ m7 X
‘noescape|NE’(在输出中不对URI进行转义)
  o9 H" \5 T3 ]) R, O此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
* U1 {5 U) y/ U( }& Y5 \, a, u& F# d5 wRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
5 l8 U; O1 }& k* |5 C可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。: w. H2 R3 C/ n
! W, L; D/ j8 P9 T
‘nosubreq|NS’(不对内部子请求进行处理)7 G2 R2 D3 q$ u: u
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
6 F/ g. n8 B. Y8 P9 R  a. d  e使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
. [( F% R$ p$ {1 H8 U2 [) f% p
# m! u5 H* {& U* n, B' A; H% R‘proxy|P’(强制为代理)
1 I# i9 F' A! X此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。% E8 c9 @2 {4 e6 N  R/ o
注意:要使用这个功能,必须已经启用了mod_proxy模块。
$ f' [: i( Q# T4 E. X
# F1 {/ T7 ?& W, U9 \‘passthrough|PT’(移交给下一个处理器)
4 D: H9 w, L3 D此标记强制重写引擎将内部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,可以这样:4 M- W+ F4 P& a5 V7 l/ D+ M' `4 m
RewriteRule ^/abc(.*) /def$1 [PT]8 F9 {  R9 x" Z
Alias /def /ghi& X0 g0 {3 \! ]' m$ J3 q
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
$ P5 O9 l2 N- \# {" @' y1 b5 Q# E注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。% P( s# F5 x* n
' t  W. H4 ?) |4 [
‘qsappend|QSA’(追加查询字符串)/ K- h7 Z, \  R
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
+ j. l  C& [' @, d3 Q% `5 S0 s( f( N9 t2 _
‘redirect|R [=code]‘(强制重定向)
$ Z, {0 n8 g5 B7 |若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。/ }' ^/ f5 n; _4 i
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。8 I' Y2 R* M7 ~( l; N# u

6 `) k  s8 x8 {5 I* k’skip|S=num’(跳过后继规则)' e. o$ w1 R# T4 R
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!  Z! y: f1 I: y3 `0 ]

$ z2 ?% f8 K% g0 w" D' c‘type|T=MIME-type’(强制MIME类型)5 l' H5 G3 g: ]! r% |( Z; x( b& [
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
6 H, C9 l  n$ i5 lRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]& m8 l5 n! i, y- k2 Q$ k



+ w, `/ K! O" M* Y6 k

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


5 Y1 N: t& V7 F

一、防盗链功能7 b" i& u" _4 E# B

[size=1em][size=1em]
  1. 8 b" x$ h/ X) }! L4 x$ c" |
  2. RewriteEngine On, `/ G( q6 D9 `- H: r

  3. ' T& h; h5 G9 _$ S0 U# k: ?
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    : w% B  x  o- b7 K1 R5 e

  5. ' s& v( q1 w  X8 y, U9 D
  6. RewriteCond %{HTTP_REFERER} !^$
    % ]. F  ^( `8 N( V

  7. ! }! k- a0 Z  j9 z
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    , X# t* g( O/ B* P8 U
复制代码

, g: [) r; [) s; m) ^- H! }. N0 }$ ?% ~1 f1 ^

8 X" p+ j' m9 t& T* W
: K% ~( E7 d% X' q; x0 R: v
( v& F8 N8 p$ N2 h( z8 ~
) q5 [$ N5 W) h, y% a6 s" W

逐行讲解一下:


5 l  M0 u4 h/ M! `4 Y$ V4 I% l5 x& s( f

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

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

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

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

: ?$ O6 M% c  j5 a3 o. r

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

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

$ P. k1 Q  ]5 U5 q

RewriteCond下:

[NC] 不分字母大小写

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


$ k! v; Q9 z# H& I1 L4 d9 L3 X

RewriteRule下:

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

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

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

* q: I4 ~, A2 W+ _! f3 C! W+ U) e

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
9 d" E% n2 a- R

二、网址规范化

[size=1em][size=1em][size=1em]
  1. 6 O. Q6 g) X& r6 E8 Q
  2. Options +FollowSymLinks
    5 c9 q! S1 c; Q+ }6 x0 Y
  3. 9 r3 h4 p% X5 K9 F
  4. rewriteEngine on
    & R$ s& n. k' {- |9 H; k3 l9 m

  5. & z0 a2 |6 h: u- B: f' \: ~6 v' w* g
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    . `! D, K& A% K  b! R' }

  7. ) ^& \7 ~/ q' i4 U$ e
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]8 x+ j8 G, r- |- U
复制代码
1 r! t3 @! p3 \
1 ~/ k5 ?8 e6 |" Z9 c( a

6 l8 N' m# x+ z& c  D
$ f9 e" ~8 G( V+ e
3 o9 _  ?* i: Q; B7 v7 B
% `/ o7 M; v' R* u

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

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

/ N- c$ R% n+ G

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

[size=1em][size=1em][size=1em]
  1. " M' O  ~! w+ y' N
  2. RewriteEngine On
    * J6 _7 l/ V. Y, R4 `) k) \- L
  3. ' L, K* v: Y9 ~3 l8 d7 `% G, p6 ]) r
  4. RewriteBase /
    - a( X8 F! T: A- p$ C

  5. ' _4 x. j* Z) e3 P' o% X! Y
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot). B; ?; P' I) |0 }9 M. \, d
  7. + T& D+ o: r3 U( g+ o: B4 b
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    ' l' ~) Y; Y4 q, q6 g
复制代码
  A6 p& H; b* K% _  w7 c( R) G

  r! L( D4 S2 l9 ~3 m% j9 L3 ]
1 J4 e$ D* K' f# U- P, F
) H8 _) M0 k$ k5 [6 A' ^

5 P2 E: s2 B6 P' M
9 s) y1 \" ^% U7 t4 V

1.打开Rewrite功能。

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

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

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

7 z2 h. n4 n: u

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

& c/ M, S9 @$ e  D* j& I

三、临时错误页面

0 m  ?# y5 T, c" c5 k

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

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

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

  1. ) A. u& _: D% d( O, j( Q
  2. RewriteEngine on
    $ z" d7 W' L' C9 @, ?+ d8 y( C
  3.   f' v8 n2 M+ l
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    4 t# @* e, C8 V. \2 o

  5. / I0 o" |5 z3 a2 A" l
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    0 m) L0 Z* Q4 {( n! M

  7. . ?5 K. b: d9 }, {% R
  8. RewriteRule $ /error.html [R=302,L], T" z5 ]5 B! u7 U+ [3 y; N% O
复制代码

* n8 g# x9 ]/ H  u* t* s3 m2 {5 y6 x+ T$ D. P: I
) Z/ O# u$ O5 E7 h* {. I, o% w
  f0 f: H; c7 M# M: L% V1 _

# W2 m' c0 j; ^
5 E+ C% R" w7 S  P7 m

1.继续打开Rewrite功能。

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

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

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

' J! b, O5 W6 b) _

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


- f8 B7 @1 \( i! t- |

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

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

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

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


! }5 X  T! Z% u& Q. l7 W

^ 表示正则的开始

$ 表示正则的结束


: i% f+ b* a2 h. s( }+ ?, U, v

四、重定向RSS地址到Feedburner

: P  w# e  D: R

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

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

  1. 9 p/ r. h* a1 Y$ I- i
  2. RewriteEngine on5 @, a$ t8 d% a6 G
  3. / O9 h3 V& G  |! d% ^
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]7 p/ u4 y- i# o3 A1 |0 ~2 h
  5. - K- r$ w1 J8 G1 Y& H; t
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    & z# D; g6 s' z; C. h+ h7 o

  7. 5 T  B; I" A1 r0 N1 h) Z; O+ D8 T- y1 e3 l
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]1 Q, b7 u$ r& B& E' j, K: H! O
复制代码

9 v* k1 r2 F; l$ m% }4 _3 f9 [5 u; p7 i* V$ c
& y3 p: b+ d& c. D
2 K; H: q) u0 R2 X2 b$ ^

* K6 _; j! O, e" }. v) `* w
0 K# H! k7 O' _$ _. N- `# Z

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

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

) t$ A4 `  M) b/ X

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

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

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


# I/ P  U0 u9 B) j' f
! O$ d& j( \3 C7 @0 f" M9 w




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