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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:" E* x1 ]2 K- Q4 s0 W# a7 O9 T
9 R' m' a5 v; d* c: Z

[size=1em][size=1em]
  1. ( P1 ~- v8 z( K& k9 B
  2. RewriteEngine On
    6 ~! X5 Z1 F4 D- n: G" D2 R
  3. 0 g9 R! T* J% g8 \
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$% s5 x, A# {5 {2 ?
  5. ( E* f8 i! J& G* P! S' h8 R. m
  6. RewriteCond %{REQUEST_URI} !^/blog/
    3 z( _) ~2 M. |6 \4 D  ^
  7. ' W7 S! Q" v( U3 h# S
  8. RewriteCond %{REQUEST_FILENAME} !-f, r: l) C, w# |" P- o
  9. * u9 J. F+ ?  f+ H- c! T
  10. RewriteCond %{REQUEST_FILENAME} !-d
    5 y  i; L( ]" Y5 z! i8 a0 O
  11. 9 J3 O* O( w/ v# G
  12. RewriteRule ^(.*)$ /blog/$1
    + S$ d  l, v( F6 q5 v) H! ?; i" J
  13. 6 s  c+ _# x' a/ Q8 h4 l
  14. # 没有输入文件名的默认到到首页
    ) c8 p7 `% F& d- g

  15. 2 ]+ c8 w1 G" M) T8 t6 x
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    . W$ }, [7 X( x% G8 l  ^9 N
  17. 9 K; _2 O7 Y; c
  18. RewriteRule ^(/)?$ blog/index.php [L]
    % f/ J1 ~8 g* ]$ m% q! p6 K
复制代码

$ R& N$ A5 z- h6 c5 {/ q# I; q  W) H, s( ~7 f; x
! U* |0 C6 w. y' u0 f* c
6 p* B$ {4 Y; v- P4 F1 V
7 z' s( O. N# v# y
) y/ @% w% I/ T4 ?% {

下面我开始解说一下上面的意思:" H' h$ s5 G+ j1 @; J2 N
- r/ r( {( Z+ _1 x
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。( s' N& {3 g. v: f/ a/ Q; |! G8 A
4 l5 P4 s% A4 ~" d6 Z0 r
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】# m5 B$ m. j% [7 O2 Q
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。% ~/ ]7 f7 M- j% ]/ m2 i* Q

- A/ T4 ^7 f# D* ]【RewriteCond %{REQUEST_URI} !^/blog/】
  Z( Z& A2 y! k" [也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
& o! D  b# O7 }9 C* A$ h: ~9 f0 L* ^3 o) \1 A4 H$ M3 }
【RewriteCond %{REQUEST_FILENAME} !-f】
+ v1 ~- J. P* U2 s【RewriteCond %{REQUEST_FILENAME} !-d】) W( _9 R1 ?, G) X- x6 @+ [7 A6 t
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径8 I' H" `1 A# \* j$ ~

& O5 b% w* q8 x9 ]4 D1 I【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
% R/ Z3 E0 v, t5 m1 l+ G
6 J7 ]+ s& ^$ z/ q+ G/ ?$ |【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
/ F2 A0 u' [; n【RewriteRule ^(/)?$ blog/index.php [L]】
$ e/ M. {' I: O- I: K这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。5 C- `" j) g$ W8 `) G7 h, @- t3 i; N
. C4 p# m$ R1 U9 e6 J) t. e
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。: S% B$ |6 @6 R$ V! U- Y& _& u7 L
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
# j6 Q6 r: J, h& M+ W9 F3 g' ?RewiteBase /
3 \0 J+ a; Y9 w* I3 H  @- R6 \5 e
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。6 y& C( Z% T* O8 Z0 P3 l
至此,完整的语句应该是:2 [- I: V4 O5 F# G
1 V  L# Q! _$ d3 |: F

[size=1em][size=1em]
  1. 9 N! b: n0 T$ k/ D6 H! w6 g
  2. ####start####
    + d8 H: y8 D. t! A- a1 F

  3. ! M( ^+ }1 u* i  Q  O+ T! D
  4. RewriteEngine On! @: O4 Z2 K1 I  P: \# F' C
  5. - D2 k2 F) o$ T' Z& v
  6. RewiteBase /3 w5 J4 M5 g) R( L, [

  7. 6 c% D$ h" n: ^. v+ D
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]  a3 D7 Y5 J$ E2 B6 N
  9. ( v* H  A! Y/ v* m8 ~( A" U" ^
  10. RewriteCond %{REQUEST_URI} !^/blog/- h' |3 H8 E/ u1 p  u8 j  M
  11.   W5 p0 {: g7 T4 |! ^- |" @5 H6 Y; R
  12. RewriteCond %{REQUEST_FILENAME} !-f: n& k! Z8 Y' `: _( s' N
  13. 1 P& P5 h( e& c/ X0 ^
  14. RewriteCond %{REQUEST_FILENAME} !-d
    + J" z- k4 h# R4 g7 W* b

  15. ' ^4 q  a6 @7 I) z) F
  16. RewriteRule ^(.*)$ blog/$1; g9 j3 \0 u$ S# u+ a/ o2 D# D9 X
  17. 8 N* Z3 o4 h! D
  18. # 没有输入文件名的默认到到首页: S1 I+ _; S' q+ Y1 W* ~- }& b
  19. * y/ s; o( {, v0 N$ m, J
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]# E0 W- O1 {4 ^* {4 N

  21. & Q  T2 @1 j6 S* P3 ]7 w  y
  22. RewriteRule ^(/)?$ blog/index.php [L]
    ; H( e4 w* W6 S) ]
  23. ! ]" T* ?' N; T* v/ e
  24. ####end####- y9 Y7 \* E6 D3 R/ D6 N( P4 u1 t
复制代码
" f+ M5 p5 ~7 c
, V+ f$ s' T9 E+ e. p5 {
# u7 x6 \- |% ?9 Z

' y0 \* q7 q. F8 g8 I$ @2 H* N9 {: Z
# D4 o" s) I7 D  {7 w- f8 Y1 O3 g  V
' u% a$ `4 n5 C/ a6 O

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思( |0 E" U( }/ I% ~( K5 s( H7 y

8 X' Z; F/ m5 H) ~7 Z! t防盗链的语句,同样需要添加RewiteBase /,如下:- F5 _( y9 A/ Z, F9 N% y

; x6 j8 a* C9 x2 V: e% k( n

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

  1. - O; Y/ ?  o  M3 Q
  2. RewriteEngine on
    4 T' a# B0 [/ Z3 g
  3. & V* j( b" |2 r7 D
  4. RewiteBase /
    1 c2 U9 C3 ~( J  e
  5. / D8 d3 m4 q' }; ?4 ]
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]0 Q& ~  J" y. ]7 k( ?! A

  7. $ C1 v" d: x1 z0 ]/ H
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    2 x  S' M1 k/ ]& Z

  9. 2 p+ U+ d" F3 i3 T5 C
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]+ o: R( ~# P5 u
复制代码

+ l% n; j1 v+ u. I
$ P8 n1 D; w3 R; h& h( V
  S* K& k- Q( i

% b% S+ S$ L8 o) ?

# z7 ~8 T& }( S4 p  g
: I2 k$ H$ y+ u5 d8 Y

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
% u9 k2 C8 h# X) [& ]; }' r6 [/ P
5 `% I! @" H0 Z" C  Y5 y5 \下面附上简单的语法规则和flags:  |1 [" f; O% Z- s1 n  `
【RewriteCond语法:】
( T, O. ?" F/ \' fRewriteCond TestString CondPattern [flags]
2 i+ X5 M4 P6 R; m  L! Frewritecond的其他用法:) f. D. n3 l; T' x# Z
‘-d’(目录)! o0 W! b8 `# H* f# G. `, C) K
将TestString视为一个路径名并测试它是否为一个存在的目录。3 v6 D+ Y8 c7 p6 J$ r9 v( ^7 H
‘-f’(常规文件)4 d: H2 u1 M: V
将TestString视为一个路径名并测试它是否为一个存在的常规文件。1 d) P0 y2 u# T, V' s  U/ K& w
‘-s’(非空的常规文件)/ m3 h. {7 Y& u9 h1 w5 w2 J
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。$ o8 c* Q8 S2 V
‘-l’(符号连接)$ P; B, y) n! M+ f: g/ G2 u& p
将TestString视为一个路径名并测试它是否为一个存在的符号连接。$ Y7 v5 J& N" P, o- ?5 @- k
‘-x’(可执行)" X4 u" K# ~0 D0 v0 s
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
6 O' a# g5 H% X* o‘-F’(对子请求存在的文件)& W5 E7 ^! F8 b" T
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
2 X3 O3 F$ E: n  [. X7 [‘-U’(对子请求存在的URL)
- N  a- P1 p% k% B检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
: M, H% l- v! M" h0 ^
( _* E- m9 i- e8 O2 w5 y【RewriteRule语法:】
( n( o$ N! ?) v! w3 }5 c9 f. wRewriteRule Pattern Substitution [flags]
- J( h% O& ]+ X5 O4 c( _! m7 q' r& c; v9 w3 |: i+ b$ r
【flags】:
5 n4 d$ s& M  H; h6 L& D, b1 Q
. g/ U1 e7 X6 ^% h‘chain|C’(链接下一规则)# P8 `8 h  u' M+ C( M- k, ^
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。+ E( z; X) ?$ j0 M3 |- B

) A+ N; z( b! W9 Y( H+ Y& x‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)1 \1 o/ A  A- x6 Y" W9 {7 S1 h
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。" T3 L" Q0 ~8 O" u' I9 J

, i( _3 j4 l  L6 X‘env|E=VAR:VAL’(设置环境变量)
4 H* ~) J8 J4 X) x此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。. |6 L0 s4 N8 O1 Z- {

: e, T( l) t5 b8 R‘forbidden|F’(强制禁止URL)
& E3 Q/ W$ d" Q) |: E强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。  t. P$ g9 o, k, ~/ n
/ w2 D3 E3 z( C/ f$ i0 |5 Q1 [' ?
‘gone|G’(强制废弃URL)
2 E# W* Z6 Z5 [% j( i, x$ k强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。2 [) P5 F/ N1 V2 S  t
9 r5 H! P! E9 C' O
‘handler|H=Content-handler’(强制指定内容处理器)
: @( u+ P2 N) ]: e( G' X  K' c. D强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
  n+ c7 Z* X; U0 n, R1 ^" g. h) i2 `9 J  i& w1 i# C1 n- T1 p! B
‘last|L’(结尾规则)
4 i/ n; \% F8 h( i" P) S立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
+ Q; u2 h( p3 b0 N
0 i& b4 i( J0 p! A4 t‘next|N’(从头再来)
# V; [+ E/ r8 Q; F8 F' Q( h重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!* G; I' X6 q# \9 a) d) u
( c/ S* R1 F  l
‘nocase|NC’(忽略大小写)' b8 `% W* A: g) u
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
( _9 T4 p4 E' L- _* ?% ?* |' O" z3 b3 c
‘noescape|NE’(在输出中不对URI进行转义)
5 i& y% m) z& a8 C- {; I此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:5 V& T6 d( v+ v2 R8 n3 b% O
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
- U9 U4 G' v' f可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。/ D/ \& f0 _; H! e  N6 ^

6 z) R5 g7 {1 K, w‘nosubreq|NS’(不对内部子请求进行处理). P- v/ D, ~9 Q3 a
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
8 j% J8 d. j1 y- ]& ]1 t使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。  z& P! l' f- S

* H/ M' m/ Z; _, J$ t, Z( N/ P8 Y‘proxy|P’(强制为代理), ^$ c' F  _, W9 J( }3 D4 H
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。3 ^5 a! Y+ Y2 r" X. S! J
注意:要使用这个功能,必须已经启用了mod_proxy模块。
* b6 S% h" v- C2 F- A: ~6 {0 y, Q9 J
‘passthrough|PT’(移交给下一个处理器)* T/ c6 p- j' x1 j
此标记强制重写引擎将内部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,可以这样:
% R) n' B% F& O& K% E: L$ ~RewriteRule ^/abc(.*) /def$1 [PT]" n& C2 ^. v: u4 e
Alias /def /ghi5 T* {+ {& I$ l
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。* n. M  l( f6 ?
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。' @& ^# W8 ~1 c

8 |" q# g. w) o0 F' `2 Y; @‘qsappend|QSA’(追加查询字符串)
5 ~$ f) p4 q# C8 F% p% A: h此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
: d& A8 h3 Y- @& m- T/ _) G& ?2 h' }3 {2 X+ _2 J
‘redirect|R [=code]‘(强制重定向)
' R, p% p/ Y" V5 F若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
7 |( M& j& l4 _. h5 @: r3 `1 k注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。3 `3 f( D" a3 s; B6 e. [  a
$ j! U" J' j7 U: Y) E2 M/ T) L
’skip|S=num’(跳过后继规则)
8 h  x( i" J" ^; e& I' F/ [1 ]此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!* T/ B8 G+ `& W5 n6 V

9 X7 O5 ^2 E; }" v‘type|T=MIME-type’(强制MIME类型)( s" K3 M% e- H1 D* L
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:  u7 s' K8 M" D6 B; [: s+ `8 s. X
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]
7 D. `" {1 `! M& q; _



/ _9 z+ U) C1 W6 c) G& G

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


" c8 P% w1 S: x/ x* b, Z5 K) `! B: l

一、防盗链功能
3 t+ `  z  n) U8 S

[size=1em][size=1em]
  1.   Z& E! m) c5 @7 z2 A$ ^2 g; d
  2. RewriteEngine On
    / t6 m3 a9 w5 i# j1 @! G, G: w9 a
  3. * E8 `$ `2 d: C/ }/ Q0 L
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]! R# i0 {3 O1 P# I% H
  5. - X, K/ o# [8 p& L" u8 s/ n3 {2 x( w
  6. RewriteCond %{HTTP_REFERER} !^$
    4 \" d1 `9 d& V% i' k4 a( ?

  7. 8 p/ ^# N3 C% v5 v6 D2 n
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]4 n1 r7 I8 Q- h& T
复制代码

/ E- x9 N/ }1 W* X" Z
3 N( A) s) T- o

2 l* x: g6 M: P; B) E6 o+ X# B/ ?3 L; ?8 q# R0 `5 v/ A7 C
+ T5 X- @) F5 e; N" K. `8 e" M  X

9 U4 D! i6 I2 h: V+ S8 M3 a9 P

逐行讲解一下:


- q! V8 g5 b6 G) X7 J0 w; [9 x

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

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

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

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


  ?" ?& B& B+ H5 V- a

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

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


0 Z, Y7 i' U+ k1 C2 m; d

RewriteCond下:

[NC] 不分字母大小写

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


  v0 }/ C/ A% H- X4 D5 S

RewriteRule下:

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

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

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

) V& l+ y2 i2 h% x  o

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
: l" ^1 e( B# F8 G/ n9 ^# a

二、网址规范化

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

  1. 5 U, ?6 e) @* |- Q3 ?0 v8 v
  2. Options +FollowSymLinks
    + I  I& {$ o4 e* {  f& ~- l
  3. / P2 |! E* d1 e
  4. rewriteEngine on1 `$ C7 _& R# o* W. R0 q. i' z

  5. 9 N4 x  i% }/ E3 j, m. @  ?2 `& f
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    . b7 z3 [5 l2 ~; E7 Z
  7. 5 X0 m3 |- P8 U! ^5 _) N; P+ l1 h$ E
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]. |: _; x- p! O+ d
复制代码

8 f0 u$ g$ G6 Z3 M2 X% ~# G
  R% l& [& S! S& Y8 X0 m" M
/ i  Z. C- y, Z3 I8 @7 N% j

3 y0 V& y3 E) [  V1 E# {( B  p: v
7 V6 ?1 x+ _( S
# _4 g/ w. ~* T0 ~* f1 l

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

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


3 S2 ?/ `8 }3 g) x. [

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

[size=1em][size=1em][size=1em]
  1. " J( L0 e. {9 x9 Q
  2. RewriteEngine On4 C- F; @2 y' g) m
  3. " m2 {3 D# Z& A% r
  4. RewriteBase /1 v, o- _9 e9 D6 i( ]' E# }2 Y, P
  5. ! j; U9 P6 i- f; z7 d6 G- R6 T; E
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    ' Z7 ^* r# c6 B( ]6 v4 ]* L" c

  7. 6 S  ?  c* K4 O4 @+ m2 d$ E
  8. RewriteRule ^ http://abc.com/ [R=301,L]8 H, f9 v  j2 f( L- k+ o  p
复制代码

. L, J/ z$ I; h  B$ \/ X
6 n& e6 y' h8 I0 h, v

( M" v% @; U+ w; H/ D; z( M' y9 U! E8 I  Q8 `4 o

$ }& W/ D4 l  m* w/ }" \/ L% f" V# d/ ~$ w9 A/ u, `

1.打开Rewrite功能。

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

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

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

, M0 A, f- Q0 z9 q/ \; [5 C- ^( p

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

% H1 b% W3 j- Y' t1 s6 W/ q

三、临时错误页面


# C: e4 R' g) @, l/ ]( [( n: x+ d4 C

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

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

[size=1em][size=1em][size=1em]
  1. / Q8 I( x* \7 G6 V  d7 j8 g
  2. RewriteEngine on
    % \$ j  b$ G! j
  3. . l" ^) z1 N  N6 R
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    8 {: x( Z0 R6 P
  5. 0 L( y9 s+ p, T* O$ j5 h
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123  @6 M- @$ J) D) \" [* o

  7. % ~5 [$ s6 V' q5 L
  8. RewriteRule $ /error.html [R=302,L]8 n+ q) u  l  c- C, R
复制代码

2 b5 q' {0 R6 R  i3 k5 v8 R! S0 @9 y6 [2 G% Z

. j2 T" U) O3 G5 I8 B( o/ ?2 a3 k$ {/ _+ z  W

6 c6 p* i# ~! {" n2 j# H
7 y$ m2 {8 L, g, a: A

1.继续打开Rewrite功能。

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

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

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

9 Z# [2 V! I$ J0 g' V

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

7 k' U4 q8 Z2 U  ~! O, q7 h* j1 J

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

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

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

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

; T( \6 `0 C0 H. i+ d0 D2 D' V

^ 表示正则的开始

$ 表示正则的结束


8 X2 F; h: }( Z! h

四、重定向RSS地址到Feedburner


; M& N" k7 f' h- n

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

[size=1em][size=1em][size=1em]
  1. - \4 X* y; g  ^. O! x' P' b
  2. RewriteEngine on9 Z, r' d, B$ j. z" k
  3. + N: v4 n7 s% S. ~9 D+ s% B; Q+ d
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]' t# n# R( |/ y6 T7 D( W  q& v

  5. ! Y, o7 l, @0 t8 O+ A/ m. j
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]+ A  A* t: ]( R; l% _2 Y

  7. 7 C* d" k; W) |% }! Q5 e; s- v
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]  `4 a1 i7 t& k) {, a5 i+ }( }6 r
复制代码

) o4 g# k) P" a0 T7 K0 p# r& u; h+ y
/ w6 |/ ~4 Z; e- B1 S* V; q
3 O) A. z# A, V! h0 V2 B% Q
) s8 C! [0 L; C' F# M
' w: X. b7 `7 `3 ^% b
  l; j! m5 q  @! A

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

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


5 H- G4 \1 |1 n) F

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

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

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

) X* T" `9 m1 g
5 u9 ?4 n+ g. W, M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 02:20 , Processed in 0.128551 second(s), 21 queries .

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