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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:6 a* z+ I* m: L
0 g# V% s. Z9 j' f- n

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

  1. 4 r, V2 \( N  @. {1 ]( T: \8 G
  2. RewriteEngine On
    8 ]3 n: R+ U; t6 t$ h& Q

  3.   l) Q( f+ a% y. z" D( P
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$5 m: |. C1 _* y$ x
  5. 8 o  q4 Q- M1 J. C3 [5 x
  6. RewriteCond %{REQUEST_URI} !^/blog/; J* y5 Q* x9 x0 }

  7. & [. D; m7 M' _& Y
  8. RewriteCond %{REQUEST_FILENAME} !-f$ q& r% Y  o& k4 d) H& U

  9. 7 F) U/ ]$ s  B( h
  10. RewriteCond %{REQUEST_FILENAME} !-d
    / P* q5 y, f% X+ c; ?8 Z& s6 V

  11. ( C: n- m2 b/ W
  12. RewriteRule ^(.*)$ /blog/$1$ J+ @7 ^  f. K3 ^% q; h
  13. " W. f2 N' r2 }
  14. # 没有输入文件名的默认到到首页' }' v. y: G% x& a) V5 `+ V( s( E8 ?( e

  15. ! r9 F# j' ^/ |8 X
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$  N# k. B5 ~7 h- i
  17. # w6 U1 T2 k5 \6 D7 o
  18. RewriteRule ^(/)?$ blog/index.php [L]
    ; E, ?# O; z1 z9 E; N& S7 X
复制代码
2 v) H8 T/ o$ a9 t. c9 \& C" S5 [
9 P! Z) l+ l" n) U/ _! Y& ]2 w

2 b/ u0 i: {  K0 `! H3 X2 g( Z" \7 h1 a3 q4 |! T

! Q7 f* ~$ i0 u4 U6 M

1 y4 F& J- R, }; [

下面我开始解说一下上面的意思:/ j/ _/ A$ x/ y$ X% O( \( H* @4 P6 y" U
$ T: [& W% @/ o  b4 t
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
3 A4 t( |, o2 S4 K4 ?& U7 t3 q/ P6 ^4 v! d2 K8 A
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】+ P. W3 J* b. g: ]
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。* I0 B3 |, s' c* ^6 ]

+ \6 v( x( a) t/ @【RewriteCond %{REQUEST_URI} !^/blog/】2 X: g% `$ q. X* W( |0 C8 T
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$4 t9 k3 ?2 T! G3 x. ^& z6 x& c

0 a& T3 {3 D; R) x【RewriteCond %{REQUEST_FILENAME} !-f】
2 y1 T" a" D) {【RewriteCond %{REQUEST_FILENAME} !-d】
  X% W+ @, Y* |% n9 n1 e. Z7 n这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
1 r7 V$ h- {3 Z& W/ h( U% S8 Z2 e! w
9 g" w4 z& a! p% x( H' v' T9 ~【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
1 n4 @! N7 S9 j5 g: E' L+ N: N/ Z* N5 u, \; e
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
& `- R# C: K6 U【RewriteRule ^(/)?$ blog/index.php [L]】" m/ O5 Y' h# l: F8 E2 _6 f
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。/ T6 B: h: P- ^" C; d% X0 b
0 l9 a$ T3 l5 m+ Y
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。: _9 l* Z1 e' \8 k4 M- x
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:& f: q+ o9 B/ D
RewiteBase /
8 A: {+ F; `" S* i( {4 Z. K: T0 F! G# h' u
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
/ f- {% d. P% |9 G至此,完整的语句应该是:
! L! l! ^/ a" e$ E. g; F
$ ~4 q* F5 \* X9 {3 G

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

  1. , A. \% a5 ~- f, F7 k" H3 v! a
  2. ####start####* \7 o0 W9 U: @0 p- N) \; w
  3. , G! a+ I# F& J* u/ d0 h4 y# H
  4. RewriteEngine On5 y" _& k; U3 E" K. f
  5. % S# W" Y8 p3 p* l4 Z
  6. RewiteBase /" i9 W# O! p# f' |- J2 c

  7. : r! E7 T  @3 }* f
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    6 J; c: g! j' r) |( t2 L
  9. 0 a) n6 P& U0 Q3 O
  10. RewriteCond %{REQUEST_URI} !^/blog/
    # l" O1 I. G& @1 E, x; B: K
  11. : Y5 N% U" s+ N5 o3 B
  12. RewriteCond %{REQUEST_FILENAME} !-f  N' \7 l7 d6 m$ k/ A/ m, ?0 e
  13. % L; `5 A( Z4 z
  14. RewriteCond %{REQUEST_FILENAME} !-d
    . i: O* p1 f3 f, s
  15. ; j# W; E) u+ k. {2 {
  16. RewriteRule ^(.*)$ blog/$1
    . a3 t5 G1 `* ^6 k8 p+ y$ ^* n, o7 F
  17. % C* O+ m- w* O: d
  18. # 没有输入文件名的默认到到首页# D0 }  ?* n- C4 I& N: [
  19. 1 M: n. d' @* Z1 t% H* e, `- |8 |0 `( ]
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    1 \' \2 \( ]7 j( N, T& ^; X

  21. ) f& h4 U5 q" m, a; _) j
  22. RewriteRule ^(/)?$ blog/index.php [L]
    $ ?9 K" b& P, V9 F) ~

  23. / o4 {- c- O& P
  24. ####end####
    ; G! C/ }4 p3 r* U" t  }
复制代码
6 x4 ~( ^. e. a+ m+ Y- B

" l% C8 t5 ^8 G( h7 U# w

* d1 g6 V: n& h" M$ `% `
+ D: N" `" M. W2 y: ?' }5 r
1 q4 ^, O0 w" N9 Q, T

: I! c1 C1 v. c& {  u

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思" ^+ l& {' u# I$ C- f5 A9 S) p

! K4 L" O' |' T3 a防盗链的语句,同样需要添加RewiteBase /,如下:, O& a- h/ ]6 f( v

( R* g' w5 H- W+ R

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

  1. 0 o1 b. l/ ~7 M( A) u# a1 n
  2. RewriteEngine on
    ; ?. X  i7 E& T
  3. # a. n7 e. x: q. [
  4. RewiteBase /- L' C  s: t2 |* x; `, w) G
  5. * H) }" u4 U) A7 d. @% ]" }
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    - m+ B  f  A! U* v
  7. & s: T( B  k3 D
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    7 T! s' f: c  i  U, v3 q
  9. : r3 Y- U) c6 L/ g$ w5 }7 w% O) w# {  s2 p
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    6 a# R1 W9 s5 T
复制代码

- s6 [8 n; E% m7 G) p  Y. \1 ^
& N0 I+ e8 l/ }! E* U1 ]$ P' [0 p

* e3 z$ V( k9 K% H4 G! T  A# e0 f+ j2 |# y: |; y4 K

/ i; V3 g' w$ \8 O
" {) z# b" }5 j: j# U

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。+ m0 ?* z/ c' S

( f9 p6 Q# U# Q4 [$ B/ t下面附上简单的语法规则和flags:
6 v7 E, x9 C& ~% n【RewriteCond语法:】
& [5 {6 N8 ~; w0 WRewriteCond TestString CondPattern [flags]4 K- [2 W' O7 V
rewritecond的其他用法:
7 K) ?9 i9 U$ k& E‘-d’(目录)2 ~' w- U+ G9 _4 c
将TestString视为一个路径名并测试它是否为一个存在的目录。) o0 N1 C6 l* Z# g8 s/ K* @6 l
‘-f’(常规文件)7 W1 v- L! E$ T8 E4 u
将TestString视为一个路径名并测试它是否为一个存在的常规文件。1 [; n* F2 k" x$ v: S
‘-s’(非空的常规文件)& x! q1 g  m# p: r
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
1 e( q% T% O$ A‘-l’(符号连接)
* ^1 L1 `& U1 X6 d3 U( T将TestString视为一个路径名并测试它是否为一个存在的符号连接。- T+ n: T$ J# f2 x8 W4 W. B
‘-x’(可执行)
/ j8 G) C2 t/ }2 T# ?+ |将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。5 y% ~. r% O$ V) c& N6 ~# }3 s
‘-F’(对子请求存在的文件)
, g7 t( Q3 ]. F检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
. [2 I1 r' m) e3 Y‘-U’(对子请求存在的URL)3 |' `2 b/ o; ], ?
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
* _1 U  O8 _  H$ Q, u& G4 f9 T# K! [1 O' k) G& q* H
【RewriteRule语法:】* r6 {5 Q" L. L6 ?9 @9 b, q+ |
RewriteRule Pattern Substitution [flags]* e/ F6 e4 m8 |
5 }; W) l0 p) [* [
【flags】:" h; E" F; r7 p- ~. `
' e* a7 G  P! a7 L- r5 V% e
‘chain|C’(链接下一规则)
7 \! g$ x5 b, x6 q, F此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
5 p  M; P# Z6 b8 c+ ?4 E- |1 Z# B& F% U7 W0 e& [1 B
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
; r* ~, [: m* U3 a" V% @, F在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
' V. Z+ `+ f* C: Q% l) f5 H4 D6 y7 y& c0 z/ t3 f% S& x4 Z7 b
‘env|E=VAR:VAL’(设置环境变量)
  W' }  w% T" {3 T9 G此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
3 q" P# @1 }( L" _% K) Z; s6 K- y7 Z& O/ @" R2 `
‘forbidden|F’(强制禁止URL)
, |( W# m1 u3 o8 A' c0 |强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。3 ~; x2 n3 }9 J" D0 A6 Y% C1 J

0 _5 L( a2 Y* n8 g‘gone|G’(强制废弃URL): F4 w- i+ S, e/ N4 i" E% B  [
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
: H. c3 E6 ~- M2 R0 X
; f" h4 T- o7 i+ e‘handler|H=Content-handler’(强制指定内容处理器)
' M5 O. F! i8 {3 M强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。$ p$ A, ?& b% a* ?' `

2 ~/ S3 e3 V8 z* f9 V+ O‘last|L’(结尾规则)$ W7 Y: d3 T( [3 P6 \
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
- n! Y# ~2 i3 m* C& I2 u  H& h! h/ b, \8 W1 g
‘next|N’(从头再来)
, R; p) O5 S1 X) t8 \重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
3 u4 D, t8 k- @9 |! [) o
8 k8 D: P" D$ `3 M: A‘nocase|NC’(忽略大小写)! T4 ^/ u2 k1 l8 W: V7 M
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
/ `4 }$ O+ u1 e* E/ }+ x# y6 n1 l$ K" A
3 z3 T$ M1 B& F. F7 l7 l‘noescape|NE’(在输出中不对URI进行转义)" l+ i8 ?+ E7 O* @3 C/ e
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
! s/ ^/ q# _' ?9 TRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]* t) W& Z5 k" G: @1 e" b% d
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。9 C# z* L  B3 t
) g% M$ {1 i) ~& `6 m
‘nosubreq|NS’(不对内部子请求进行处理)! M1 ]% t3 J2 J* [+ t( I
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
* _1 j# T* J. R  x% W, u$ b使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。2 \/ R4 }! H( K4 L
- Z* K$ |  H: c0 s5 _* g# |
‘proxy|P’(强制为代理)0 ]* r3 r8 u: s5 U0 F# l4 E
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
! d% S0 ^, ?+ Z: n) W4 h" z注意:要使用这个功能,必须已经启用了mod_proxy模块。1 ]# j% M& w8 P  m" b

7 v* R$ t% i3 k2 R; [- ?5 }4 ^0 v‘passthrough|PT’(移交给下一个处理器)% ~3 H* C$ q7 M& f( 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,可以这样:; W' a: |& z# U  H
RewriteRule ^/abc(.*) /def$1 [PT]
. C$ O- B% g( l1 N) eAlias /def /ghi' x( l& k# }7 G( c
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。$ ~9 p7 @3 F9 G( w9 ]
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
9 q/ k/ b7 ^2 d7 n$ t+ ^) l( D6 c+ W" T% [  U+ I4 d# b# k7 p* p
‘qsappend|QSA’(追加查询字符串)$ Y( y$ y6 n, g; ~
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
% V* ~1 r$ D# ^& k( t/ z% G1 J" _7 Q0 Y& [( P7 ^
‘redirect|R [=code]‘(强制重定向)
9 ~$ p. p" ]6 Q! p& V若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。; o5 S3 l5 @& E! D, h# |( p) ?8 R; T
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。: |2 q7 h  J" n1 L
3 D( z, _+ g# a( M& G7 e% S
’skip|S=num’(跳过后继规则)
" v1 M7 o6 w4 g0 N5 [8 k' F此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!" {' |1 ?! E( ?2 f6 i2 J  U' ]
$ Z; D8 f8 V7 I. f
‘type|T=MIME-type’(强制MIME类型)1 A1 D- q* Q) n4 f7 N5 `
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:' I  V5 W9 d9 \5 n. s# ?
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
; `1 t4 `7 W5 O! q9 S0 p/ ~+ g



  W3 B4 u9 n4 ^! E0 K

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

( c/ y, c/ D. s4 W

一、防盗链功能1 ]) U- X: E( g$ M8 {! ?# K6 F' \

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

  1. 9 n$ {! T' R) Q6 j' a" R) {! g
  2. RewriteEngine On
    # k3 `; S' M( |8 p: G5 k  h6 u

  3. ; z- C2 z- R) \
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
      Z+ f& }% s; r  ]% {# s- B
  5. 9 e7 L' X/ ^* j; Z+ Z
  6. RewriteCond %{HTTP_REFERER} !^$, c' U6 |8 w+ B3 `; m
  7. - d' G3 b  e9 V0 c
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]4 X# d$ e& B+ ?8 u- f
复制代码

+ ^; L$ s; J' z2 E. d) H4 d* a4 ]
2 e- m2 Z7 n* y- ~1 j& v

, R; T* f1 J5 k, K0 X5 j' S5 j" X. i& g& C- Q9 X* q% {5 T
* s; m6 m+ N4 F! w0 W: s7 L! [$ o

! `$ ~4 A' R7 O( ?0 ^. |7 R! y' D; ~( D

逐行讲解一下:

1 z2 `8 ?, l, S

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

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

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

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


( p. b3 z/ ?" F. U$ P( e

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

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


" ~1 S$ I  ]- ?$ ~9 z$ o/ r

RewriteCond下:

[NC] 不分字母大小写

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


" a. F3 {8 ]  ?$ ?  H

RewriteRule下:

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

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

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

- K: K6 i/ q4 b+ K6 ]8 {

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
9 Z$ @/ k+ w& C. o# I

二、网址规范化

[size=1em][size=1em][size=1em]
  1. * ]4 u& W6 `' P; D7 g
  2. Options +FollowSymLinks+ b( F9 v! |9 O7 X& v2 `7 H! A

  3. * M7 J/ j% y3 }6 j5 Q
  4. rewriteEngine on
    ' S- X' I: @# z( V4 Q% n& V" O
  5. & W( U+ Y% c( z3 [5 b* k
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    & a+ A, I* _( c& x2 i

  7. 3 n" I- E( r1 H: p. ^2 T. c
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]8 E, c) q  D4 A: X, M1 j
复制代码
0 s7 _. v$ B6 m# u* B; E

" {0 y0 A$ j* n2 n0 j0 {
0 |3 ?. ?$ q" Y7 P8 y
7 I+ ?0 U! i) T; f5 f

8 R# v* g4 a7 Y1 B! M1 ?- E1 z
: u7 _% v2 n. D

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

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

& h# [6 w/ I$ W# k! J7 y( r

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

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

  1. , @/ C) i! c. E$ `* H" |
  2. RewriteEngine On
    1 ?) X9 I8 [( ~

  3.   d- m$ |/ G: \. t' x
  4. RewriteBase /
    " G- _1 f: m) O: M% {. v

  5. 5 c: `% i# i6 _. L- g2 ]
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    & x: u+ H9 g5 O, M
  7. 5 M1 v0 L( C" D" B  Z
  8. RewriteRule ^ http://abc.com/ [R=301,L]# g) I& E7 s! `5 D
复制代码
2 N  M1 k" K- }8 p
3 H! V# G4 F9 {/ l0 Q

1 i9 C" G9 p7 ?* |0 _& Y
7 d1 Z7 Z9 m8 E- @: i% J' y7 H3 V6 ~$ n+ [% l: K

, l7 h) W2 N! v2 h# ~- A  s9 |

1.打开Rewrite功能。

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

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

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


" s9 W1 r0 `2 @/ Z; f8 G$ i

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


+ M/ n) S7 @1 W8 H" E4 _" N

三、临时错误页面


# W7 m) P! i' L! V7 b0 L

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

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

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

  1. " M# p* ^, H6 j. h. C
  2. RewriteEngine on4 n/ n  w  |! n

  3. - J/ j6 t$ S) e* W1 B7 R9 \6 Y
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    / x# W5 i; o0 |) b" {" Q( I

  5. : c+ Y2 L0 d$ V' R
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    ( v. A  H6 L; x% U: N2 i- D
  7. + }7 p" j( R! F# G' f
  8. RewriteRule $ /error.html [R=302,L]& d0 A, a$ @! F# n; V' c- a
复制代码
& {# I; N. q5 }" U
; C; H3 v( ^; D( ~( @
. L( @( u$ l: I2 P; r* F1 h4 |8 a9 e

- e/ W- \  G& O1 |# t# J0 P! J" P2 _' L- |/ b

' y2 W/ ^5 e/ L% n+ m7 L

1.继续打开Rewrite功能。

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

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

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


" I3 E4 D. G. b( \# l  K8 ~7 N

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

' ?/ K2 k2 j6 z6 s" {. f" p

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

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

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

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

6 o, l0 C/ S4 Q: k  G; {" n8 O* _

^ 表示正则的开始

$ 表示正则的结束

! |" i# `0 |* b9 m& M! b

四、重定向RSS地址到Feedburner


# J  G9 g: W: n7 e' t* N, G0 R$ X; d

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

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

  1. ; k) w& T6 b/ ]3 ?, K  `& r
  2. RewriteEngine on
    6 u- O0 m; G1 D# J  }9 D

  3. : V9 a. ~! D; Q' T$ V
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]5 s. Z) c5 z) p# D1 y5 Q! I
  5. ' v  N5 K* U% T- |' N, f
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]! Q: E( d+ B- x. q  B2 u

  7. ! N8 j+ O4 O& a! L; [$ X, o
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]9 `' Z  y' S* y; B
复制代码

+ o1 W0 V& U0 k
6 [, J" C" E) {* F6 R

  e$ D3 a) V! H$ l& U9 f( j* S6 d4 M4 b1 E, m: I& p9 {
# G3 S1 n; G; H" ?2 h
# @% {) v+ T9 m3 F, h- w

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

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

% c0 h& C' N& H0 R+ [# c- p- q. G% Z

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

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

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


+ y! u! i/ |4 k# h4 c5 u" t
1 M2 d# _4 w- h7 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:27 , Processed in 0.057882 second(s), 19 queries .

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