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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
! O9 h. v: `1 C0 D7 ?. v8 v6 P. X5 \# ^  t! @: p

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

  1. 6 c5 J# h( Z; Z; y$ M; ?, P" x
  2. RewriteEngine On5 n5 j9 k) h* h$ N' ?$ J

  3. / N% t. b2 {5 e; |1 O; u/ s
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    9 x" h) U- B/ Y; @
  5. 0 \; p2 h0 J4 T# P: a6 H+ |
  6. RewriteCond %{REQUEST_URI} !^/blog/! X. `& E0 c2 v( v
  7. # m; R" K4 b/ T* Q2 `
  8. RewriteCond %{REQUEST_FILENAME} !-f) e! X% E% j' p$ ?
  9. 7 N! t* f- F1 ]2 ~$ V
  10. RewriteCond %{REQUEST_FILENAME} !-d, _  Q5 E6 p$ Q# y

  11. 7 d* X5 V- r3 x, S! E
  12. RewriteRule ^(.*)$ /blog/$1* b2 u7 A, C; s. h" I/ n( S

  13. 7 b4 j: q' f3 |- X4 ^- o( a
  14. # 没有输入文件名的默认到到首页
    : w8 O. l/ `, y" M6 a

  15. . l  K% G4 o' }& z$ b7 O6 L
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$1 o" `" g% g* ~4 z  L7 `  H: o, ~
  17. * G8 Y0 I1 ]1 z- {7 E7 S, O
  18. RewriteRule ^(/)?$ blog/index.php [L]! E1 p! m0 d  O$ V/ g6 X
复制代码
% q2 I7 Z9 {4 h+ o' d

! O6 x) c5 M2 Y$ b. d, n2 Z
& a* ?, @" B5 J+ ^; P' G) E: j- X0 X

. [" r  H( B' T' X

# P6 Z; {0 n! q2 k4 m' K% R
8 O* k8 I/ {& W. B% @

下面我开始解说一下上面的意思:
% @. k0 Z) M" v2 A9 b- ^$ X5 Z; W8 s& w
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
/ }; g# I' {9 n4 j4 B( [: _
' C& e( m1 c* O$ B. s1 a: k2 t" {【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】; Z( b# ~2 G6 N0 I: y+ i* g7 \
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。/ q1 D5 ]7 }: z/ L+ P' A& \

: c, e! |, n% F, b( ~* G【RewriteCond %{REQUEST_URI} !^/blog/】/ O8 Z, Q  L+ l
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$# ]$ ?2 T+ \( Y0 t

! V9 A, u4 v! l/ J【RewriteCond %{REQUEST_FILENAME} !-f】
* J% X9 ^  H1 p; [* Z* S, u【RewriteCond %{REQUEST_FILENAME} !-d】
, z) `7 m' H6 w' ?( r这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径" G; w! u, T" h# \) n! B

& b5 J2 ~5 o* y5 T  L【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
; w7 W% f* `; U1 G9 j" b6 x9 _) D3 K3 ]6 L9 i
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】' h& `3 v1 U1 Q& z8 ~
【RewriteRule ^(/)?$ blog/index.php [L]】, q" y2 L0 t) v1 @  r- i0 @5 D
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
; t8 _. f* d  q! A% C* ^" k% z1 X/ X; {: M7 k0 m+ ?
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
9 {. t9 ?2 _9 A+ E$ \) m. I答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
$ o0 I- @  C& R) T' N# wRewiteBase /4 n: V4 |7 q. Z* p( p; c

2 l# ]& S7 U' }5 ~) R还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。  r- B# }& C, O( ]5 F  s! x; _" A. K( W$ K
至此,完整的语句应该是:
" A7 W* ?2 e! O# t. i5 @
  B& z8 }/ |$ ?1 W

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

  1. ; N1 x  |; D! Q$ Z- \8 X$ a
  2. ####start####5 G; `! O4 {" j! ^% M4 S$ }
  3. , d: N2 w% A# U4 o$ E) `' B5 {
  4. RewriteEngine On
      t6 p  L. @+ k2 O, R

  5. ( Y- |! y- ^' b/ E& @
  6. RewiteBase /: K$ L8 D5 g3 ^5 q* i% F" X
  7. ' }% U4 ]( S( f/ i
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    1 f1 d! u) Q9 x+ Z3 y+ \) [

  9. 7 `3 `" y6 b0 B" q
  10. RewriteCond %{REQUEST_URI} !^/blog/& p8 f) w$ B* o- M7 U! t% f
  11. - N% |! V$ P& D) P% }% T
  12. RewriteCond %{REQUEST_FILENAME} !-f1 W1 D+ U) n, Z/ X
  13. 2 O' {6 ], h" ~( C) Q
  14. RewriteCond %{REQUEST_FILENAME} !-d+ b9 a/ u3 C( |; z' I

  15. 0 f2 q9 T/ d6 b
  16. RewriteRule ^(.*)$ blog/$1
      Q5 `/ Z  H/ J! D

  17. % J. N! Y, d. V+ y2 j
  18. # 没有输入文件名的默认到到首页) _; o4 L3 \  H% q$ I$ ]2 O1 J
  19. 6 X: I  r* g% N3 r
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]: A; }0 W" ^0 x; \& |

  21. 8 H' a, F6 g# h8 e3 B6 M/ r9 G* r- a
  22. RewriteRule ^(/)?$ blog/index.php [L]" n& H' @  r" R  N; i' K
  23. " z$ d9 ^- f9 Q8 Q9 F4 Y
  24. ####end####
    # i/ M: ^) |+ o" h  ?0 [$ K
复制代码
  n3 U8 O1 v+ \8 M
9 a$ f6 l+ p/ v5 P

- x! w" D" b* s* k0 S5 j" _7 U3 W$ y" o7 m) r9 }+ \* Z
- t8 Z; K6 i/ R8 r# v

7 g; C1 v: g, m/ ]6 n  R. v

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
, G$ }6 i' S! A5 h2 q% E) X% P8 {" C; }3 }0 g$ t3 a
防盗链的语句,同样需要添加RewiteBase /,如下:
# T4 o3 V5 P" J$ A7 D. D; @
$ N. w6 j6 e; M6 w3 e' W1 Q0 x

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

  1. 1 q- J: X& I8 y+ n
  2. RewriteEngine on
    ) @, L, n4 R  _$ z+ P* ~) D- E- t) ^

  3. 3 ]  s& S5 O, b# ^# E' K
  4. RewiteBase /! v* h( B  G' x& J# c( h
  5. 9 N! V7 b$ S) ~3 m- h: b+ i( o1 D
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]. q- ~! b% T2 Q: c

  7. 1 X( H3 \" i6 f9 F
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]3 y$ F/ N: F% N$ K1 q
  9. 6 j. O/ v* @% \
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    ! _) B7 R; W% q8 s1 g
复制代码

/ B9 ^% K; c# u( o
" F9 D, L. U9 g+ n
- B4 U9 g1 X2 p

! i* M) J3 J% G" @8 i+ ~
3 W. I! {( a5 n* ^! d% E  E

& P' }- s# B, o$ c4 T

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
' Y* z5 h9 N6 e! i" d
/ @. l6 V2 P" L下面附上简单的语法规则和flags:! x7 A: Z) q3 p
【RewriteCond语法:】
8 P3 f. C, z3 s: t0 N( ]% M# IRewriteCond TestString CondPattern [flags]
1 v2 }6 V8 C( n3 j, B' Hrewritecond的其他用法:
, I( T" F- k& O- o‘-d’(目录)
5 S5 S' Z: E+ D! b$ o% Z. m将TestString视为一个路径名并测试它是否为一个存在的目录。" Z/ j. g  F! Q2 b1 c* U
‘-f’(常规文件)7 }  Q5 X. c* W
将TestString视为一个路径名并测试它是否为一个存在的常规文件。0 b: {5 G, H+ {
‘-s’(非空的常规文件)! |0 O' H: `4 |. _  ~+ O" h. r/ z
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
: m. ]( g5 j) ~7 c) z! C* r8 N4 |* A‘-l’(符号连接)& k$ ^: N, _. y( l7 D+ Z/ j" v1 ~
将TestString视为一个路径名并测试它是否为一个存在的符号连接。! y6 h# T' D* [; r7 e8 t: {; P
‘-x’(可执行)
! S. v7 P  [$ F' M0 T  E将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。% r! E6 ~. {% l1 O. ^+ j8 ?
‘-F’(对子请求存在的文件)# @/ l: C% d/ J& F# m
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
: w" C: C# D) d& O9 G! y0 V6 {‘-U’(对子请求存在的URL)
* c) A% y! D  u/ [检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!4 t! y: [* J! K0 h( b4 ]6 x/ [

, ^2 f6 j& j3 k* z$ x0 a& R【RewriteRule语法:】2 Z: Z' h. W% e8 y! w- o( z
RewriteRule Pattern Substitution [flags]: y" t6 [* t' Q, P2 d

' s' }$ s  t: ]1 g- V, p0 x8 o8 X【flags】:
! R. r% E( t! L+ ~; P8 B6 _% L! ^' u. W) v
‘chain|C’(链接下一规则)- ^' H: l- |( F, n
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
' J4 N# q; i! V1 E1 h7 B2 w: C# t" m
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie): F9 H6 S0 Q" Q# i; T% W7 \. F3 q" q
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。$ _& h4 N( M% _" }& M( d
) r  W6 |5 s7 c; I
‘env|E=VAR:VAL’(设置环境变量)
4 @% k2 [" O3 a7 l$ a此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。" G) b: X# T, U' `, P# e

2 b( g& b/ A4 ^9 v3 C0 O0 F‘forbidden|F’(强制禁止URL)
) `4 t2 j) [6 x9 h* G, B( S3 B强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。, }0 |2 r% U! A7 h- f3 D7 c

% g' c! J6 h# W' M4 v; b3 i2 {‘gone|G’(强制废弃URL)1 i% F! ?: h/ J! ?
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。) p0 w! M* Z3 N, w$ R0 R

3 A6 Q; w4 P; V‘handler|H=Content-handler’(强制指定内容处理器)
" p0 C) B+ _+ E( E) c强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
4 [& G( j) |% [: ^+ a5 a: b% f  \9 s$ L& U/ H# n: m, q; U* K& ]
‘last|L’(结尾规则)
, d8 W& k: E$ x! c$ q6 q立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
4 H7 l! W& ^) H5 K
1 x- ~# Z/ M8 B# j‘next|N’(从头再来)
0 Q& l/ }& i0 l. p重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!" _, j8 F6 s& n$ f
4 X( A* m6 X. L; v, Z  D
‘nocase|NC’(忽略大小写)6 Q0 {& |( ?6 Y2 z& b  ]2 x8 E
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。3 y5 f! {' V. U! |7 ~8 z) G
- e0 ]9 E! r& Z" d
‘noescape|NE’(在输出中不对URI进行转义)
1 Z& j3 O$ ]& R! L( c& J此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:$ V/ n  w7 C( }, x# C" K
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]2 S7 B& Q( ~( F8 k2 b( b
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。) R- W9 @! @8 N9 P
7 T5 k# `( v- G) j; {
‘nosubreq|NS’(不对内部子请求进行处理)
; u! `! ^& R- o4 O3 d2 p- H在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。, n+ h$ ~9 y6 }0 T7 M. A
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
. H' k1 f" I# e* S; a" `6 q
  }- D$ a- n9 K) Y4 S- m6 h+ n- @, }‘proxy|P’(强制为代理)4 G7 ?. g, O( m: N1 }: g
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。% y9 u8 m# G2 e0 _3 F$ R4 U3 P
注意:要使用这个功能,必须已经启用了mod_proxy模块。' u! a9 S7 A$ x# s0 O& P  r. v
3 c3 f) X; `( K1 P% O
‘passthrough|PT’(移交给下一个处理器): ~8 G8 E# ^  p0 J# [2 p7 ^
此标记强制重写引擎将内部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,可以这样:
+ T4 Q6 x* P) H$ V  kRewriteRule ^/abc(.*) /def$1 [PT]
) x. @! L4 H/ x" PAlias /def /ghi. J; ^$ r! K8 `( S( F
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
' A2 A# G+ A  q" b: F: c注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
! l0 l$ R# u1 l9 Y! z: |2 e  L8 T' m, h& Z
‘qsappend|QSA’(追加查询字符串); l8 K6 i# N. z  l7 l# _  C
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
/ I  A' g( i7 |, ]0 @
5 u) p+ ]% l- P) l‘redirect|R [=code]‘(强制重定向)$ n& ^5 F3 D: \8 M) w6 T
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。1 ]$ a$ R) Y, J0 Y+ x
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。  N$ o0 d# T6 A- k1 g8 D$ H- n5 N" o
: n5 F/ t" M- E1 [; q3 i8 k" B
’skip|S=num’(跳过后继规则)
, k, o; P, @$ |6 I0 h, M* n& N% B% u此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
; M; R  {- g. [9 y; `$ |
5 U9 R/ a9 c6 e1 K5 e! E; n* n‘type|T=MIME-type’(强制MIME类型)
7 |  V$ d* R$ g/ S6 j强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:0 i( ?2 t3 A+ e! X0 k/ L
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]) Z( E  `. F2 j6 o- w8 P0 S, z6 u



& g8 x* }8 Q2 ?2 x4 w4 U

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

- a$ O7 f+ G1 j% E, }) n+ _0 A

一、防盗链功能
  L7 h7 E6 Z$ S" A4 f

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

  1. ( N! d, i$ ]6 _; k; S
  2. RewriteEngine On
    + {( \! f( H" Q: v
  3. 7 k3 i) m9 a& s7 J# L0 r. ]
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC], C5 q* W2 f/ @8 H$ e

  5. 3 g! f; E+ B+ [" H( f
  6. RewriteCond %{HTTP_REFERER} !^$
    + d: h2 |  @7 T

  7. ) {6 U2 J, l6 t# j3 A1 H
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]7 Q2 t3 s3 U$ K1 G& S3 Z
复制代码

. f7 {; L# u  ^4 E# Z3 }2 t4 a" i5 e2 V$ ~9 M' d4 }
) s5 z) A& W0 `2 Q) a

* ^: Z. C+ A3 z- V* `( w* z

( R. f5 n+ n$ S+ X8 L2 T
3 z, c" ?, M9 D6 M  X3 v4 S

逐行讲解一下:

. h4 K4 v. ~+ K/ p6 X2 Z1 m

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

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

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

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

  E7 w  d! Z/ D' U) O; p

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

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


$ y( g/ v  j) }2 ?5 m3 Y

RewriteCond下:

[NC] 不分字母大小写

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


; w  H* L# [5 u) C

RewriteRule下:

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

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

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


7 }  b3 l  r" H  n% H$ J

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
# T& A' K1 p, b9 L0 T. m4 |9 ^, h2 i6 P

二、网址规范化

[size=1em][size=1em][size=1em]
  1. 4 h3 I: c/ h% l# d- _( J' l
  2. Options +FollowSymLinks
    + G7 B& Y6 }7 m2 ?4 p, _
  3.   g$ k8 k: A+ x) S4 D" Y$ [  X0 U: u
  4. rewriteEngine on
    1 [2 B3 t; B* \5 Q& V* w" g
  5. # T& J! s+ S1 H( r
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    4 J- e( d8 t) I
  7. ' U. |7 I2 M* ^4 s
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    , j  r3 t' s5 p* o: Q
复制代码
/ C$ f( T1 A$ M$ O% L) Q5 J
* Y6 m2 ~; n# `1 q. H, u( z2 Z

$ E4 H5 m9 ~* j9 P6 n# u8 H8 Z% K. W' |0 h9 j9 @

, Y6 L( q9 c% e" n8 ]
  A) [0 R( F2 a* F% H3 i: H. ?

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

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

5 y: ?% K- u6 [# p& r( N

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

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

  1. 6 T& I5 \# Z* H) T) j
  2. RewriteEngine On
    $ X( G5 |' y# w# x

  3. 5 w2 A7 u6 U* l" N2 |& _8 D( H
  4. RewriteBase /) E8 k5 ]/ A4 }3 R6 s. Z. l
  5. $ B) G2 o7 \: w% W7 _0 Q
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    * m. q; n1 I/ ~/ B$ [
  7. 3 Y3 X  u" y( M9 @# h
  8. RewriteRule ^ http://abc.com/ [R=301,L]" }; X0 g9 v$ Y: f- n
复制代码

. N1 _; H( n* h5 |3 g, p% n& q9 K" V: k8 A

9 x* r$ H8 N0 M* M; ]8 _1 `% S5 R. C, }4 f4 R. y

# }$ E- ]0 P( F; X# H- t5 p. c1 b6 Z0 k
* O3 E: N( r# q+ n1 h- q$ K

1.打开Rewrite功能。

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

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

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


! S$ n- @( b: \! c* K$ t# e* g

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

) T4 B, R+ s; S+ y3 R4 \

三、临时错误页面

& k2 m& z2 Q& w" Y5 e; I% n9 W

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

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

[size=1em][size=1em][size=1em]
  1. ; w7 s  L" ?  R" g
  2. RewriteEngine on3 w& ^4 u0 F2 D) L

  3. 9 {! v  J( M  _8 u; M* e2 p, u; v  X
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    + k1 W4 L* _" r6 j$ q
  5. 5 o, o! F8 F  ]/ r5 q, v
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123$ u6 O7 b5 j$ v- k4 J; ~5 t
  7. ! F) W3 V' H, s. B6 ]  L5 V
  8. RewriteRule $ /error.html [R=302,L]
    * ~+ Q( g# ^: f& N/ @' U
复制代码
  |  j7 d# |. r" p
+ P( W  k- w' R& j2 g+ z7 y* l0 I/ h
* X* e' Z9 R2 e& |
9 n- x) Y1 N$ x* ]
4 R5 U) Z8 ?$ L6 c
1 b- K- B6 e( ~/ W6 T9 a. u9 q" t

1.继续打开Rewrite功能。

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

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

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

$ o, ]1 r( O; S* V; v: K

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

4 V3 v9 s. r4 I. c3 q

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

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

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

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

) |7 Y9 C) k/ s3 f2 C6 L

^ 表示正则的开始

$ 表示正则的结束

# w& Q6 e/ L6 b5 {6 h+ N/ S% u

四、重定向RSS地址到Feedburner

( f/ c9 _7 ]  a# G; Z4 s, J; P& B

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

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

  1. / g- h/ E4 e  u4 W. a- u% V# U
  2. RewriteEngine on- u  F1 u; n& @$ ?  Z: H4 A' H
  3. 8 j/ ~% {1 Z% x- S" Y. d' J
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    : t/ k. H) r: v  N( O
  5. 6 R$ o6 ^- f+ w
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]+ f& L, A; _+ P; t3 y

  7. ! U( B$ F  q# y: ]$ h6 F+ B1 |1 n
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    + Z1 C# X" `0 z7 y/ q  y
复制代码
% x1 w1 U* ?7 W) o* I
: }# X+ `* s/ X  L# f

* ?1 j% P4 ?0 @4 B- P& p
3 S4 P/ i( O4 Z4 v2 ]- z+ O! \! _9 j/ [

9 M7 [- X) r8 d9 f4 C

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

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


* z( V" }  \3 N% _$ E* S$ |

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

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

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

7 G7 g% y$ Q1 j& J( i) _: @7 o: X

6 ?, k+ ?! H- t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 23:28 , Processed in 0.059999 second(s), 19 queries .

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