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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:! g' G; w! p+ `- x5 Z1 L% j

5 P/ O7 ]- l9 \7 M4 q  _. e$ x

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

  1. - W* R- C7 t6 R- r
  2. RewriteEngine On* @0 @3 y( P$ `

  3. # G, k8 K2 M  U
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$/ M! d9 A1 _3 q3 t$ ?. y

  5. 9 ?" N, T& T3 t4 K6 k4 M" L
  6. RewriteCond %{REQUEST_URI} !^/blog/- q! \' [( l* x6 {
  7. ! ~0 n- G7 E3 m4 t) g
  8. RewriteCond %{REQUEST_FILENAME} !-f/ n# F8 k% J3 l+ f+ N" l  A
  9. ; L, @, D1 I" N7 X) K5 d
  10. RewriteCond %{REQUEST_FILENAME} !-d) E0 q: ]& n6 G! e( ?) K
  11. , x1 ^1 R* d" P  B# |/ X) n5 f
  12. RewriteRule ^(.*)$ /blog/$1" h- w2 T' B; V- ?4 E

  13. * G% B- Q+ }. j* t- _8 `
  14. # 没有输入文件名的默认到到首页3 ]4 H( j3 M. Y
  15. ( Y1 z9 p9 R+ ]/ s7 |" J# B
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    * F# S% \- k. Q

  17. 4 V6 S% H* v( a# I# Q6 w
  18. RewriteRule ^(/)?$ blog/index.php [L]' m; K' d; R1 e2 _3 D
复制代码
4 ]8 f5 v, P% s
7 g, f# ]9 e& N; P

* K1 k6 p( N9 z" u8 p$ `+ f) Q# r) Z7 z- U
$ V& D% m. t" q5 R
! S' G: I* n- s; D2 D" B5 h. z

3 ]0 B" c& i7 v

下面我开始解说一下上面的意思:+ ?  o' u6 h# e4 @$ E

( I3 ?, q* ^* R2 C& p, D/ J: M% n【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
& I9 g/ Y- ^1 V  i' E, T
9 ?9 M) ]. n* I. H【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】5 I: G8 N7 f* i6 {  G4 r
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。. S7 d) I+ @& U; u2 ]
. E) w( X% M1 I- w; ~+ g/ U
【RewriteCond %{REQUEST_URI} !^/blog/】1 R0 l- g# h6 n# a
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
5 s6 G! _) g8 J) b  [4 [
+ G* d$ O% ^$ G. E$ W& a【RewriteCond %{REQUEST_FILENAME} !-f】) [0 O8 Q+ G0 U" k% ~! u
【RewriteCond %{REQUEST_FILENAME} !-d】
! q2 o. y/ T' W; N) e/ [, [这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
1 |3 K; K! m, U5 P3 u; _
2 Q: l% S' f7 f0 D5 j1 @4 e【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
3 g7 z4 ?6 @" |) q* Z0 Q
6 l' m* Q; U; z【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】1 m" H6 a$ q: a
【RewriteRule ^(/)?$ blog/index.php [L]】2 o! ?& z& f: f; N7 U4 ?3 Z
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
2 U' e8 G* s) E* r; |/ }- n/ U& W# B" f* a" K' H9 t" V
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
, c: H) K$ I. v- j+ }6 @$ Y" F答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
/ V) E' q3 O7 }  P6 E2 fRewiteBase /
6 z  f0 {( |* [5 G5 Y
; [4 H9 z9 Z' {$ J1 B8 q! T' V0 e还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
; z1 N  ^  z  P+ K9 C$ Q! V5 C- h至此,完整的语句应该是:
; }( d$ Y  D& v# B' w( U3 {2 Z( T  n7 B' i; @9 q, N

[size=1em][size=1em]
  1. 1 |2 K% {+ k% m
  2. ####start####
    ( T: r) _0 s5 w; v$ {

  3. : U3 {- n7 @0 z' T7 Z
  4. RewriteEngine On/ i- u1 J& X2 {& @# H3 m6 Q  n" W
  5. / g+ p! e3 \) }+ H' c
  6. RewiteBase /, H$ N% _, l) Q- g, S# q
  7. 0 I& ]& H- W1 j. D' [+ @
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    4 a' I7 s' t( k% J% C, r; `
  9. ) j1 \$ s& A# ]: \$ p2 s
  10. RewriteCond %{REQUEST_URI} !^/blog/
    1 e6 a/ e, m$ F6 d9 P& {

  11. 2 }5 A" k, |7 z: s
  12. RewriteCond %{REQUEST_FILENAME} !-f
    ( h4 P8 G. ^4 Y9 q* w) {
  13. 5 Y7 p* F' g, ]+ U
  14. RewriteCond %{REQUEST_FILENAME} !-d
    ; @6 x7 a% F6 v9 q% K

  15. : ~' f& I5 D$ p# t6 G
  16. RewriteRule ^(.*)$ blog/$1" D: K# l$ y, y

  17. - h/ c9 Z1 a3 u  ]3 `. f+ _
  18. # 没有输入文件名的默认到到首页
    : _% A+ l( z; o7 [! ~2 U
  19. . V! \! l% K+ g
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    5 a3 C+ H, S2 l% B' z: ?# s
  21. - w/ b- z: w- b
  22. RewriteRule ^(/)?$ blog/index.php [L]
    , c" Q# e7 C' J( h4 S/ g  ]3 Z  J8 I

  23. / @* Q+ Z4 l+ G/ f0 Z
  24. ####end####
    ; x- q7 k& D7 E7 s/ r
复制代码
: R5 F7 w$ h0 c, v* u( I
; Z* Q7 g0 O8 Q. d! y5 N! ]& ^

5 u. C9 b1 ?) T/ x' v
/ }# `4 v: A# y' ?* v+ w! `

2 P: y. k2 g" G* E
* |$ z# d( g0 w

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思; c1 L  d; s$ |4 b- m5 a

+ y& m. E/ N' f" b防盗链的语句,同样需要添加RewiteBase /,如下:8 k1 B; D& f6 ~1 k, h6 i
5 p1 P! D+ t% a+ E  u& H( a' e& k

[size=1em][size=1em]
  1.   y3 t% b9 A3 j$ J
  2. RewriteEngine on5 W9 x/ s$ v+ c" b2 W, s! d
  3. 1 l9 Z7 m7 x. ~9 {" d
  4. RewiteBase /
    & [' l( I1 Y4 E( |. D1 {

  5. + p5 Q0 R8 S- c. ~" C4 F
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    # r" A, N: M& F% N. |9 N9 I

  7. , \% U" y; S1 U
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]1 N' F: O" [) l1 G. N, y

  9. 9 Q/ A  `. D, e/ J5 \# e) x4 R% Q  ]8 R
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    $ o% W) d. e4 o. H; Y6 }( [9 m& W+ M3 _
复制代码

+ o' h4 {. z2 X5 G* g2 T6 K, f/ {8 X6 U: T. ^3 i
/ v. U* ^3 Q( A# x0 x; C
' ^+ V1 e: H. I/ \
! m/ t& Z8 G& S3 y3 g

. f: @3 F. }2 \  i6 T* {. J) @

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。4 o2 w. {. @! H2 D$ ~8 ]

3 z" ~& C8 O4 R8 R8 N8 H下面附上简单的语法规则和flags:7 j. `8 j$ g! Q2 K5 o5 O, z
【RewriteCond语法:】, J# V: F3 z+ X7 N* a$ l, v. [
RewriteCond TestString CondPattern [flags]4 ?; L. U; Z5 X4 d/ j; p; ~: r
rewritecond的其他用法:
* b  Q6 Z8 d6 R: Z: m' J‘-d’(目录)- B, G$ u: D+ h6 u0 B* z
将TestString视为一个路径名并测试它是否为一个存在的目录。. J, o9 M) v' q
‘-f’(常规文件)
5 C  i& b6 h2 c9 l3 a4 C将TestString视为一个路径名并测试它是否为一个存在的常规文件。
5 L, f$ Z$ e6 [" A3 E* f/ T1 c# W‘-s’(非空的常规文件)# F3 d' E; s  ?% O
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。' j% P5 |+ @- f; `* ^  N" q
‘-l’(符号连接)) A/ q9 }/ S; C) R
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
% L* s) D8 r7 D  e0 Y‘-x’(可执行)
0 ]' `$ l5 w% ]; w  P将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
- P. C$ Z3 t3 c: X* e! B‘-F’(对子请求存在的文件)
* E* y& {9 N5 D1 u( N2 |6 R检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!+ a0 A& {' `' X$ u- L
‘-U’(对子请求存在的URL)
' R7 Q: d, j/ B$ i$ n) F9 S; x, Q% L检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
# k! [1 h0 }5 f; ^( n4 L5 V- n
8 L5 x* g4 c2 |, F0 k; h1 {7 g) N0 ~【RewriteRule语法:】
4 J; L( T% J8 a' X+ C) z! JRewriteRule Pattern Substitution [flags]' G/ f% b3 ]- g3 G# D

* M& ?! ?$ e$ k: P: I. c( i【flags】:: V3 g) P7 f8 X: i- |2 M9 ]! L" |

2 W; n$ u* |3 e7 z) t4 m8 Z( w‘chain|C’(链接下一规则)
2 N* X  Y# Z: z1 T! g5 C此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
! p) T2 W5 A$ M3 o3 I. \2 p6 s7 O. Y0 w9 A2 J' n
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
1 @' ]9 [: b/ b' ?4 Y+ W9 s% w6 M5 F在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
( i, N5 g3 ?2 V6 U5 r9 Q3 \7 f0 Q( t0 |: A* j8 T
‘env|E=VAR:VAL’(设置环境变量)
3 Z# @4 J) \& \( w" C此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。. w3 R, a4 G/ ]+ t% r2 u
. u; L) f4 ^  M* M; D5 x
‘forbidden|F’(强制禁止URL)( C: y# b3 T4 s0 J* d
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。6 P( Q! I! X6 t/ D

  e5 K4 \; {9 z+ E* C‘gone|G’(强制废弃URL)
$ s& l7 b# g; `  l% s6 Y1 H强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。- H% k/ R2 U8 U

* `1 h; v  u6 [* b6 n# P‘handler|H=Content-handler’(强制指定内容处理器): F" Y5 t7 W2 e+ \
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
8 M5 P- t9 v; e# w$ k5 [0 L
! I# J, F  b- t: M  z$ S/ i‘last|L’(结尾规则)4 L, Z% R) w' O! A2 h' l* ?
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。8 r9 o2 Q7 ]# c- q- \4 U7 j4 U+ X& w
* m" s  E% ~2 [+ q. S
‘next|N’(从头再来)6 }  D- Q+ h9 L7 T( Z
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
% C! R. M9 h  U6 `0 c; [# a' O5 `6 F+ F7 }: @
‘nocase|NC’(忽略大小写)  Q: B- d$ y" [
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
4 v+ v) a/ a$ c$ R# f: q% T  N+ D# _4 F3 ?* S0 c# Z7 W4 V
‘noescape|NE’(在输出中不对URI进行转义)' t+ }% p5 w; O4 D. L
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
- }$ N5 K: A* Q1 Y* VRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]( J  m3 p) b: [1 Q4 a& p4 e
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。$ L5 Q/ A& i) l' L
' }4 I& t% c/ F6 j( b
‘nosubreq|NS’(不对内部子请求进行处理)
/ m) \* q! u% Q( D: k/ M在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。7 a! Q& k$ i& H$ _, h0 P( ~+ f. ]
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。8 y& A2 C: X( W

8 {$ r* K3 v& R, _, V* H1 z( G‘proxy|P’(强制为代理)4 y: P  K, j$ d$ T/ b& Y+ B# z8 H0 j. Y
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
4 N! R6 T+ x) o8 y6 `3 f! V注意:要使用这个功能,必须已经启用了mod_proxy模块。
, j( T* G$ c: i3 z& j4 T+ d9 C. C$ u
‘passthrough|PT’(移交给下一个处理器)
9 H1 ?" @3 n2 w0 T5 p此标记强制重写引擎将内部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,可以这样:% A, r, g1 a- P
RewriteRule ^/abc(.*) /def$1 [PT]2 Y6 o" Y: G+ k
Alias /def /ghi
9 C- @: T. L+ b如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
0 q# b$ e' t! D. p1 F9 x2 y注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。1 y+ ]8 K% h# o# Z& o

& g/ q  n1 h9 W: ?+ i: {' t8 e, l‘qsappend|QSA’(追加查询字符串)
6 c: s: }: T$ |8 F& p此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
% m$ I& R3 @( ]# q! A$ N, [5 o/ V& @  I
‘redirect|R [=code]‘(强制重定向)
* G% X/ k4 x7 M( ^* x' c7 |$ M8 P( T若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。% h# V3 u( a0 p+ o- V7 K8 b
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
! g& |; C0 l$ N1 {0 d# M+ V/ J4 v# D/ {. _! H$ o
’skip|S=num’(跳过后继规则)
" F6 O1 e- k; K- L9 X$ g$ }( _; a此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
2 ?& r7 t% ^6 O8 h# M
* E. [/ _* K7 M‘type|T=MIME-type’(强制MIME类型)
1 M9 e# M, ?- f+ ]/ R强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:0 ?  X- J* s# n" l) H! A
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
, V! O9 c# _6 ?8 c


, D# |6 p1 W5 D7 i

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

; i: i4 B) t$ k& v( H

一、防盗链功能
' T4 M5 f  q, w5 X" T8 K4 a/ J

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

  1. , n! N' c: g3 |1 L
  2. RewriteEngine On5 o( s9 V" }* O$ f9 I# K0 m
  3. ! ]% ?6 z8 O* ^; B" [$ z3 `
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]4 \  V. M  |  o; \' x

  5. 1 A' m3 S/ \/ S6 m; N" |
  6. RewriteCond %{HTTP_REFERER} !^$
      u6 k$ l3 o$ ~) Z5 T% }
  7.   ]8 u/ C  U- b4 Q& P
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    & f  j1 k1 V" p# R6 X" d
复制代码

+ ^) E4 _5 B* A' Q  R2 P( c. k8 h6 f- ]- M

6 ]3 B7 T& C  M1 G0 _# W6 r, u' K0 {
7 B1 U( k9 f  ^. l- W

6 _# i! U; x7 a& A

逐行讲解一下:


! f4 m$ w# W8 p, _

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

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

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

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


# n. C7 D/ d2 v8 q

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

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


+ X0 X$ A: e! x0 H  h" o

RewriteCond下:

[NC] 不分字母大小写

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


5 L1 s# _% v7 T; L, m4 R

RewriteRule下:

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

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

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

$ K; ]3 Z$ w6 Z! L

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
4 ~) B1 Z# G( C, z: Q

二、网址规范化

[size=1em][size=1em][size=1em]
  1. # Q+ m+ ~1 I& `+ X8 A: j0 V4 P6 X
  2. Options +FollowSymLinks6 T8 X1 n! V) j+ }% e
  3. ! G9 s: e$ [% F- @' k  \, q  x
  4. rewriteEngine on
    $ a: {7 K: X* |: j% \

  5. / f! N9 F  [% w- C
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    8 e  v' k  z) j- y+ ?
  7. . y) B8 o  i' Q' ?/ c+ y
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]/ \  S; n, z$ s. o4 m/ h' Y
复制代码
- i& Y( I6 X1 B9 c* P5 f' q

3 }" s2 q8 ]" W/ v4 S
% W+ X) E! S4 r( c. f5 v
* l* I1 C& z/ y8 `5 W

! S# F3 n" l, S) M) |
' g; o' ]' H3 K

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

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


+ s0 Q$ K$ u0 q9 P

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

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

  1. 5 D: P) M+ n2 V  R. B: Z% D
  2. RewriteEngine On2 Y  F3 A) U& h0 w

  3. % h4 C$ P/ G( N9 _4 O5 p0 z) W
  4. RewriteBase /6 [3 y" J6 I% t& u9 J) h7 y
  5. 6 z5 ~1 u/ h( H& j- u
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)' r+ o: z/ i5 z9 \% Y

  7. ' p9 L4 l6 p" U5 H- f
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    % e7 C! D8 z: D1 ~/ W
复制代码
& h' p. B  P, j$ D. K' o
% L' |. e5 a0 O) e6 j( a4 V: ]

, V! B3 N% _. R4 E; W
2 Q. H7 Q8 R$ N4 b* q$ A. n% ]6 G& U/ G! B3 M+ w/ C
7 y$ o. V2 [. r, a0 X

1.打开Rewrite功能。

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

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

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

' N% @" G+ k, v0 E9 f* g: X

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

7 ^: C. a# |  A( J" a; P! |6 q! U

三、临时错误页面


' `, v* L0 O% @& q. t. R" ?

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

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

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

  1. # @$ p7 Y+ d! {: e2 K# Z0 J* \
  2. RewriteEngine on* i* k0 c$ p, k6 B% P8 w

  3. * K3 V5 M8 u/ t1 g; p% ~7 Y4 t' C
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    7 H1 E( ^6 n- A3 I( z

  5. 4 o: u1 o/ Y' \! m/ O  d3 k% }
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    $ K" X  k- q+ I
  7. : k# g0 T# e* o# I
  8. RewriteRule $ /error.html [R=302,L]
    * |" a9 D4 A* A
复制代码
4 \' W2 }2 s5 O, ^2 P, L# [
6 Y1 r& `# V) V' Q3 O' s9 H) {" U4 f
# _/ f4 B; N" B

0 X5 Q7 B9 x- ~: k" S, i, w% c3 P. f, }
' m0 }. q5 v- X2 [* v

1.继续打开Rewrite功能。

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

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

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

/ d: v/ z- ]$ Z

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

2 y5 Q6 c8 L6 Q0 w' S% [) y5 {! l

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

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

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

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

3 d2 I9 _8 W2 k4 N0 F

^ 表示正则的开始

$ 表示正则的结束

' t. j  o/ f- e& _4 w- U

四、重定向RSS地址到Feedburner

/ n) T! ]$ T6 J1 O- M; V

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

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

  1. 7 X' r1 T9 L7 B
  2. RewriteEngine on! I6 b# z# }; O: l* m% I3 T

  3. 8 ], X: l0 @+ ]9 A: b
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    7 x0 F5 Q7 Q. l  P% X  m( u0 t
  5. , p# u9 o2 z3 v0 G1 W4 i7 ?
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    ) }. \( y. U# w8 j4 E. X
  7. $ j  C. I; L! n# P! Q6 S7 d
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L], H6 H& b; \9 O9 w9 `
复制代码
: L" X. t" x# S+ j4 V

( b, O* Y; B( Y0 M0 p6 ?. t% z

/ V# R' _+ X% t* L, J7 A
2 A( q6 i- ]& S" H8 c7 z
' W0 K: E6 H  ~* b  ~9 A* u" q2 l1 |) Y) u

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

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

& F$ h2 i  ^3 t2 `0 I5 W

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

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

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


% ?/ F! w- T/ j9 K8 B+ U
; G% Q; O/ P% E- w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 18:04 , Processed in 0.056757 second(s), 19 queries .

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