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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
8 c7 `/ ?6 i5 C9 ~( y/ f% K  ?& \2 ^5 ]

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

  1. # S9 N# D' y- d: }( ~' n/ v2 o
  2. RewriteEngine On' W# Q( A% F" g
  3. $ d7 g$ b+ |9 x1 n) _7 Y+ Y
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# Q( `) u4 b6 B4 i, v

  5. - F3 u) g. }/ r2 b, h" r
  6. RewriteCond %{REQUEST_URI} !^/blog/! A$ C. u& z4 K, B8 k; p5 P
  7. # D7 m/ ]4 c' m0 S$ u
  8. RewriteCond %{REQUEST_FILENAME} !-f( u; q% d/ L. C, I# m: v

  9. $ D. \3 i, i. \9 z  b% ]
  10. RewriteCond %{REQUEST_FILENAME} !-d
    2 C! ]& c* L1 ~) d% _$ P
  11. 3 b7 y. t8 f$ H: k2 d% R* X
  12. RewriteRule ^(.*)$ /blog/$1
    9 y6 O7 g+ }: v- Y8 V& n; F

  13. # W4 ?6 K% A/ k" B
  14. # 没有输入文件名的默认到到首页7 H  l8 j. S* m8 y. c$ }$ n
  15. ! ~5 M' f8 _4 T+ l9 _5 J
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$2 k- P9 B' p+ @7 _
  17. 4 [! h. P6 b3 ^! z& B
  18. RewriteRule ^(/)?$ blog/index.php [L]
    / W/ M# A+ D* U
复制代码

4 |4 p: B& I( z( l0 _
* T4 J, F2 Y, R6 k( Z9 t/ V/ x) ?

2 ~0 S/ `* h: ~0 ?: X* }5 {, t; p. J. B% `, W

0 }& h& Y1 Q0 x

# j, c4 d9 t) ]% f/ y# E8 h

下面我开始解说一下上面的意思:
6 i7 L- S9 D5 `* l
* o9 e4 _+ D/ U' F( J, w) u  \【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
/ X: H+ y! s' Z* w. K) {( |9 ~( z2 R& n# {+ `) x
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】4 R- \5 k4 f( m; H* T5 {! p
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
+ ^3 d/ U: p  \/ }* E5 n9 u
) N, Z7 y$ ^0 ?, V. v6 _% l【RewriteCond %{REQUEST_URI} !^/blog/】
8 _/ O- p/ F+ v5 i7 W4 s& V" J也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$# z0 w* w) V! b5 _0 m) V8 O4 ^

/ L, y) K5 m$ N- l$ {# [【RewriteCond %{REQUEST_FILENAME} !-f】
5 `. `0 H/ ^" ]: y. W# c【RewriteCond %{REQUEST_FILENAME} !-d】# E3 v" O3 T9 |( \/ W% n5 J5 M0 Q% K5 A
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径. g$ \" \8 A6 f' z- O3 e

3 U# }1 n! f/ S! ]" {2 p1 a【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。! Q0 U3 x' _' o0 |) K, q
) W* H/ _9 q& U" _9 I+ q8 ^2 M
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】8 ], _* l, T  C# p
【RewriteRule ^(/)?$ blog/index.php [L]】5 w) U/ h6 T9 l8 M% ]. i% m2 P
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
& L  S% j  {( C7 i; [0 R
+ S4 ]- g# d2 V9 U9 }2 ~+ z" V现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
- {& @2 I. {: A" S# @答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:) L" w% j1 Z4 ^
RewiteBase /
  m2 O, k9 W1 B8 |7 H3 C: e, R( G; T- t. Y: v/ w+ R4 E6 v% ]# `
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。8 h. ~+ R$ s$ `0 I7 V" `
至此,完整的语句应该是:
1 E* `2 [1 R8 N; J( ?3 N
% C9 n8 A( N. ]7 G. W; I! F

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

  1.   Y( x$ t& s/ @! V9 k
  2. ####start####2 d# R' d6 I/ b- l/ n. W
  3. . s, H, K* t* \; R) \( T6 v
  4. RewriteEngine On
      Y& n1 J0 K8 J2 S: g

  5. : f0 E6 d. A8 a+ z$ |4 m# z- X
  6. RewiteBase /6 Q/ V4 o4 G. C3 x9 z/ u

  7. ; D: o- ~1 i( Z! q' F  ^
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    + e: C- I4 h: x& y' b

  9. 3 Q( f6 A9 T2 L6 X- p3 M
  10. RewriteCond %{REQUEST_URI} !^/blog/
    1 g! g5 v. q, |1 K

  11. 8 B9 l. q- M6 e7 a# a
  12. RewriteCond %{REQUEST_FILENAME} !-f7 u) T: o2 A) J# b, I

  13. & ^; V0 @3 J1 k! @# E
  14. RewriteCond %{REQUEST_FILENAME} !-d2 A8 |# q5 S3 B0 Y" [

  15. . `# `  G' {. V9 W5 `7 @1 h
  16. RewriteRule ^(.*)$ blog/$1
    % \; a- F8 R! W3 Z
  17. 5 i+ s. P1 o4 J+ ?
  18. # 没有输入文件名的默认到到首页* R* E) v1 x3 W$ {
  19. & z% B2 s  q; j# K6 Y' ^$ V
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]8 n/ m3 \/ m% M; n1 e( g
  21. , T( M* ~1 }8 `& R; J% o; X
  22. RewriteRule ^(/)?$ blog/index.php [L]
    6 p. U% Y2 `9 d- f- O5 O. @7 T
  23. - {7 g- ~1 H. H; N3 @# B6 d
  24. ####end####
    . h9 ?" w+ C. ]6 J8 W4 X7 l
复制代码

6 O) c+ F' |6 {; a0 v8 h) s) a! H* B! V; i1 q2 R# m2 n5 |1 Z  E

. ~$ C, j3 d  \  h; C
4 P6 u5 g% j4 P" e) E' ?

* ~  L% t& ], O% y- P6 r) p4 G

- s; Q$ r* P3 ?0 @/ q

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思! W& a3 i7 H& F" J/ p) ]1 F
1 i# n+ c- d2 P5 N3 J! S+ z' o
防盗链的语句,同样需要添加RewiteBase /,如下:
! G5 L% k/ |( a+ G0 ~" T
1 R2 G2 W) Q2 _/ j4 l) ^

[size=1em][size=1em]
  1. 7 K! _  {( J5 p$ n3 m8 m
  2. RewriteEngine on# [/ Q. k3 j. v2 }/ G6 I; g
  3. % V: ]9 }+ G& ?$ \7 t; _
  4. RewiteBase /9 r9 n" K2 s5 W
  5. 0 R9 \$ `6 k! Z8 ?" ]- A+ y8 M
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    2 Y8 @7 B9 i& y" s: Y1 [' O0 Z3 @

  7. + c! |1 t9 f+ J. k9 Q7 ~8 A: {
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    9 I7 Y$ O4 }3 {6 G5 P" [
  9. : t/ z# e# X9 ]* C" X* k' c
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]* W# I, @8 M0 y$ @& e( Q) U
复制代码

$ A; a" K+ j7 n8 [
. I4 l/ v8 C8 U8 i( A7 n

" o. f& W7 L3 M; u
6 W" k7 `' q0 x: a- R3 B* C( k

% M4 X  q/ U7 N( k* R! M4 ]! \

2 }! q( n4 g  P7 j( Z9 Q

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。+ p+ L" m5 S+ X9 s

" x* N* ?( y$ Q% f3 t2 ~下面附上简单的语法规则和flags:4 W- N* l8 B2 r/ r1 E5 N
【RewriteCond语法:】
5 B( `6 C. c4 c0 c$ ?  wRewriteCond TestString CondPattern [flags]
0 F  M- S' w' J/ orewritecond的其他用法:
9 W/ o7 X  }2 I& F! f! z9 O- E‘-d’(目录)
& K) a7 G" F: ^& R4 a8 p. i8 `将TestString视为一个路径名并测试它是否为一个存在的目录。
. ?5 r6 q$ s2 i! t; r‘-f’(常规文件)
5 W4 U3 Z, W" R! K将TestString视为一个路径名并测试它是否为一个存在的常规文件。! N9 j! W% ?  Y" ~. V
‘-s’(非空的常规文件)
" I% [+ R2 ?& L; c9 {将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
( Z' A$ h3 j- a- |$ ~, [' g‘-l’(符号连接)
$ T+ i: K7 M- K! [" o+ Q将TestString视为一个路径名并测试它是否为一个存在的符号连接。4 w7 T3 Q) B% \9 b8 \- s& B: L: q
‘-x’(可执行)/ [5 C0 z# `& }* B2 }, i
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。# W7 ~$ B  g% M7 ~! E" S' }
‘-F’(对子请求存在的文件)
7 E' q( @5 ?1 x检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!& R9 b3 v) e0 T
‘-U’(对子请求存在的URL)+ _. ?' S' r$ ~0 m4 J8 F# f/ C
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!+ p( i  V/ t" m, @5 {
7 D2 A7 N  r6 U$ j$ F; X9 G
【RewriteRule语法:】
  w* ~2 `8 ]: I- c1 c; i: SRewriteRule Pattern Substitution [flags]0 I2 |% G% ?9 h! M2 z; C
0 i- i' A  h& a2 k+ g  P  ]+ s, N
【flags】:; b" s% H5 m8 ^' \5 I) U' U6 W3 i

' M$ ~0 ^! w! Q! C; y‘chain|C’(链接下一规则)9 A- k/ p. p( @) @* P8 D, y% W
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
% D5 ^2 T* T  B% b
& `0 l% E; A8 s‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
3 `/ ]- k: g, e' E! x在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。' U7 U4 f: L. z. D
1 \1 U5 i/ b4 D2 P, g
‘env|E=VAR:VAL’(设置环境变量)
( ^; Y$ i  f/ Z此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
$ d' I2 S3 f" p# }, m% |5 E: H# ?3 |) j* M3 |
‘forbidden|F’(强制禁止URL)
3 P5 h  p$ a$ v" d: p强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
" n+ X: S, M6 z2 L9 o2 c9 K
7 W% }0 P9 r8 P  q& s/ C‘gone|G’(强制废弃URL)
$ p: l$ A& ?0 s/ ^/ z强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
) Q# p4 b, S4 V+ {( o; B2 i2 N7 e: u# L
‘handler|H=Content-handler’(强制指定内容处理器)/ a- N1 I3 r3 ^$ {$ V
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
+ E9 S. _- F7 U' w5 a$ I# j$ r1 V
* O! e# S/ g9 }1 I; A# P‘last|L’(结尾规则)
4 o/ F% Z# u  J立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
& E0 c( Z4 h, C" `3 i- x0 V% m7 y+ E
0 _& u* L9 p' j% y: J‘next|N’(从头再来)
! ?) f9 u; L& v) V重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
9 F9 J0 u0 g4 b) u( Q$ {! C* b0 H, @; u4 t" Z8 G+ M
‘nocase|NC’(忽略大小写)
. ]3 b% @9 c) q& r它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。
: k! m: V6 N7 z5 I0 r! G
( L' J% W( i. w0 @‘noescape|NE’(在输出中不对URI进行转义)* W: E( a- r  ?8 ?
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:# e+ U6 F4 e5 e# O$ y; K3 D3 [* g& f. I
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]5 e- ?/ Q7 S! [- [# ~: ]* r+ `2 m
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
, }9 r& l/ a# m. K) P9 A1 T/ Z# x( t
‘nosubreq|NS’(不对内部子请求进行处理)
7 N2 b8 L; v: ~+ N6 |9 B" V在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。3 U1 h4 W0 {5 m: ^* T$ `0 N
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
5 h# k' K. ^/ z- e5 R; V/ v8 _" `2 l! Y5 d
‘proxy|P’(强制为代理)
5 n- @9 F7 v5 f8 s+ F! {此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
2 b8 c% E9 o. e- ~; c; g6 c注意:要使用这个功能,必须已经启用了mod_proxy模块。
5 k- O6 g/ O, h* Z" ]9 r) L3 X4 d. F8 U- t; ^' e/ ^
‘passthrough|PT’(移交给下一个处理器)0 J5 H4 G" o( V7 o7 h
此标记强制重写引擎将内部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,可以这样:
# Q4 b/ r4 W  U" mRewriteRule ^/abc(.*) /def$1 [PT]
- R4 k! [4 ^2 i- X3 dAlias /def /ghi
6 W" H8 L3 d: m如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。5 J4 P) O) T# u" W' C5 W
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。0 y, x: E* Z* h# y

# x6 P$ `, ]( X‘qsappend|QSA’(追加查询字符串)
2 g5 [2 x7 w0 b( i) m" J' q此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。$ V  i% a) q, [% b& c7 {
# x8 i7 {( s9 ]' f
‘redirect|R [=code]‘(强制重定向)% }% `: A+ O/ }' y8 Y8 L+ F
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
* ?. n% z* u4 F注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。1 H; h9 K; U5 S. F8 K+ {; {: g3 |

8 r; }$ b1 Z6 o8 r5 k) E’skip|S=num’(跳过后继规则)6 f7 j% ]5 e4 |$ K
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
8 `5 T% E8 B# |5 K# k/ K2 b
$ X7 p" l7 i% X, b9 Z0 c6 Z& H‘type|T=MIME-type’(强制MIME类型)
6 [  s! P$ o: o) I4 {# i$ E强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
5 M# D3 H: q8 z9 H" Z. F2 VRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source], _' D2 F; Z# h9 `% ]& L5 |



8 f7 p( H) R! A- p- l

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


. M/ Y! P  C! k4 j; X7 U" G

一、防盗链功能3 M. @) M7 N; a5 b

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

  1. % {! S+ _5 g$ U  ]( M
  2. RewriteEngine On. o  j( h8 F& Z9 X9 L
  3. & H* c# {% S& ]" Z* V' i# X. ]5 s
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    ! d+ Q  b4 [; @; k2 P

  5. $ j! f/ _% J2 T: V3 O
  6. RewriteCond %{HTTP_REFERER} !^$
    4 G4 W) I6 W) J" _
  7. ) K5 k# o& ]! `  `6 Q$ n$ [
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]( i* g9 A5 }. w9 Q" R6 Q; l6 l  ^* V
复制代码
9 h" H# I- [+ G( T/ m
4 ~  M" b2 b6 v, ]2 L8 y$ B
* r4 |& A" Y7 H

1 n1 h4 B, v6 W# z# J" g3 p
$ `% G- h: o: Q
/ t3 w! D5 \0 b

逐行讲解一下:

. W3 |1 o1 N2 ~: q9 c: {

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

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

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

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


$ Y" Q( H" z4 F1 ~8 {; ]& Z7 R$ w

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

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


+ Y, J, c# v: ~. `5 y

RewriteCond下:

[NC] 不分字母大小写

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

! N% S- N7 a3 \* G; J& l

RewriteRule下:

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

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

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


* K) d0 ~% S7 t9 u% B

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm9 D0 g- T( I" G, W2 [) L

二、网址规范化

[size=1em][size=1em][size=1em]
  1. 8 R0 T" e& p- t, w3 `8 j
  2. Options +FollowSymLinks1 \$ L" Y# j" h* {
  3. - k4 v& g' N. l: v
  4. rewriteEngine on- ?  Q' y. k8 M7 w$ N

  5. 3 w5 K: s: c7 F4 x, m: p3 E) W
  6. rewriteCond %{http_host} ^yourdomain.com [NC]/ w9 F8 d# {4 z6 Q- t
  7. * L" h) ~/ X$ x) C/ k
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    2 }: M9 u2 e; Y" J& j. ^6 ^. F1 q* x
复制代码
& W' ^, U4 T% o0 t

" d3 ?+ [" S4 t$ @/ _0 c

) t6 b: l3 F  l9 p9 A* t/ o. a$ D) T7 B; `: g8 U( e  q6 d; P7 Z

/ w/ u5 S1 E4 W  Y
  l: l5 ], u' f5 c' Y

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

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

) J) U$ u7 W& ]% C8 `( o

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

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

  1. & V) V& {# r- U: {1 b  j8 r1 S) Z
  2. RewriteEngine On
    6 d  H3 R; h6 t3 G7 ~: N

  3. 7 c5 A8 }8 r7 a! X) K8 ]
  4. RewriteBase /& j! |. _7 n; r( _  O
  5. ! N2 }- ~4 _, M5 M6 @
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)  z, h: n5 W7 ^8 Z- g6 l! k
  7. 7 i5 f; |. t$ d" P* u- ~  {( A, _+ m
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    - ?0 i( `. U- }  F
复制代码
% `6 G- [/ V' @. y2 U$ T

. Y# u9 d" _. ^" ]
( V- L+ Z; m, ]

7 A/ G" u, L# E( D. l3 q
/ [0 }/ E! C$ e1 y' o, N% K; u+ L4 A2 P' z5 r

1.打开Rewrite功能。

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

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

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


) J& D- X8 T9 p2 Q. Z+ p1 }- K; _; J

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


3 K" W2 W- Q) T3 D) @1 A

三、临时错误页面

( W1 p: x% C& I

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

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

[size=1em][size=1em][size=1em]
  1. 6 L$ a  j" X" z$ z( K
  2. RewriteEngine on
    ; a& }! g  e9 h9 T

  3. 8 x: }1 @0 L  m+ [5 |+ q, ^1 }7 F
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$6 [; x' N/ U% L" U3 M+ Y

  5. . B/ S4 }4 w; o( U$ z- c* d
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123
    5 x) I# ~2 z( D6 \/ d4 ~4 k  k+ @4 ^
  7. : m4 o8 a, ]# W# j" D1 L' ]
  8. RewriteRule $ /error.html [R=302,L]9 w: @( |3 s2 {. s! Y2 ]/ w
复制代码
3 Y' P) |+ q7 T/ J; p1 o4 A

) @: Q( h* c5 K* G
9 _0 H% G& c1 J4 w/ n
  w) C3 w1 D/ v  o3 k
' c4 Q: M4 _( _% d4 F+ c& ^

, P( ~- }) m/ P0 I

1.继续打开Rewrite功能。

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

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

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


3 ?! O; x" j' i5 F& C

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

' P- o; ~: V9 U8 j. Z2 v- a

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

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

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

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

5 m" r# H, }; \# }9 `- n7 l

^ 表示正则的开始

$ 表示正则的结束

+ b4 w+ {8 e) {: ]

四、重定向RSS地址到Feedburner

6 l5 L' f/ o0 n! G) P

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

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

  1. : N( a% n: \' N5 `
  2. RewriteEngine on0 h7 W. K" N% B) G. d+ T" w
  3. 4 j0 R( t. Y8 F
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]. O/ }& U5 ?5 n7 q0 Y

  5. ; o; @5 S. T; i
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]0 H8 O; V! A: ~( x/ T
  7. 7 l3 o' t! `/ r1 n1 J
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]' p6 I. J& t( ], r9 C; }% m: F, @
复制代码

+ q; F, H2 A0 G8 i' a! ?; V, ^
/ B9 g. I( n6 |2 g! U$ C

* F+ h2 {9 b6 g2 T% Z* [
! Y9 t2 r% }7 H" K" N( L( K5 k
3 j6 r7 v2 p9 Q; ?6 a7 R+ P9 r3 Y9 {4 w

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

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

; t5 [# R( \- v- w

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

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

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


( Y+ K1 I: h1 k6 g' _- S
. b5 N) ^4 P/ t7 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:29 , Processed in 0.123431 second(s), 22 queries .

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