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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:" x* G( Q( l$ g$ j' K
  a  X! C* ?, b+ L

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

  1. , j+ u/ `$ E: O" n  Y; U
  2. RewriteEngine On
    6 F$ s  a) T1 W7 d4 ^

  3. 2 u0 R3 K* Q+ D
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$: y5 r8 B. ^4 M% f* N% s

  5. . J( }  j9 B4 f1 V) L& K
  6. RewriteCond %{REQUEST_URI} !^/blog/4 V: ~* A& s9 Q7 O

  7. * I4 z& x- \% t! s
  8. RewriteCond %{REQUEST_FILENAME} !-f6 y+ f/ s9 b7 K% \5 h) J+ Q  R
  9. + Y+ |8 a! D7 h( E' I
  10. RewriteCond %{REQUEST_FILENAME} !-d
    - ]" ]+ S2 t- Z5 U9 z* Y
  11. . F- e+ @4 J3 z/ }- z
  12. RewriteRule ^(.*)$ /blog/$1
    2 F  M; [( @6 _. u. C
  13.   Z7 d+ G. D) u' J  N
  14. # 没有输入文件名的默认到到首页1 G& M/ _0 x) z/ s# O- b$ @

  15. 8 C3 L" s5 f1 |
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$) L( W0 N2 n7 x# @/ p

  17. 9 Q- P8 k2 p) c4 t9 F
  18. RewriteRule ^(/)?$ blog/index.php [L]8 U1 Y- A7 i& E$ A+ F
复制代码
2 l3 w4 a; M( [8 s1 n

; t# g# _1 |$ V1 V

! ^- G7 x: l& m1 s3 s$ I0 i
( f- Z+ _0 E; J. y8 _& `+ i

7 \" ~" V% B- v
5 F4 R7 X. u  g/ B. @5 y

下面我开始解说一下上面的意思:
% v/ j9 ^! x$ ^) c% _* X/ b: q, J( Z3 W7 v
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。6 q" o& @' v! F1 h8 Q) x" o

& ^8 B: J' h4 r. g) {【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
5 l1 r; ^) I9 G. S4 Y' B- @这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。6 `! w* a' @2 G

% S$ g! s" Z: F【RewriteCond %{REQUEST_URI} !^/blog/】
9 d$ A0 {9 K8 m+ Y& c7 `5 C! u3 p也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
( v. K( L7 Q1 Q$ j
. B/ v2 l0 ^, t【RewriteCond %{REQUEST_FILENAME} !-f】
; l5 P# f3 f3 v( e6 ~【RewriteCond %{REQUEST_FILENAME} !-d】: ?" h0 t2 b9 W/ X' T  K3 d( }. Y
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径2 X1 M0 Y8 Y9 e: H; T* [9 S1 P
1 v9 f0 `. `1 K7 J
【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
8 m$ D5 L( n$ d9 B7 p* o$ ~& o) U& K) ?2 N3 |
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】9 |- \( L9 d* ^" m3 Q, d7 h
【RewriteRule ^(/)?$ blog/index.php [L]】
7 s4 `( }# m! z5 D, |这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
$ g/ b1 l2 R' l: V) O3 w& ^$ j* P- l) f( _& D2 V, Z6 ]
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。' X( S4 Q1 q- f; u) p. ~4 I; |: K+ O
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
' ^( c3 w* V7 q' Y1 Y! \  b. lRewiteBase /
+ o  o$ K$ K! c. a# Z1 Z$ @% F. B
还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。. ?+ w4 H* w3 h' o. K
至此,完整的语句应该是:* ~6 E0 f! J1 }/ Z$ ~5 {% B& X

# O% D% Q) I4 E) A6 A  Z+ @& R

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

  1.   Q7 z! }# l. N+ x: a$ w0 J9 B2 B
  2. ####start##### Q% T: |! B# j: Q
  3. - t# I. c( C1 d; i4 W
  4. RewriteEngine On7 N+ k1 Z1 J$ g; ^  t
  5. 1 P/ n, S9 i; D; L) z
  6. RewiteBase /
    0 l+ E3 F. T# x* ~9 `. [* A

  7. ; o. _$ A- ?3 c' x7 A( l6 v
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]" L! A" J, t7 m6 y) q

  9. + l$ B! F2 j: q" {/ R
  10. RewriteCond %{REQUEST_URI} !^/blog/, n- i1 i( i" X

  11. 6 ]/ v; S& w8 ~8 N3 V2 K
  12. RewriteCond %{REQUEST_FILENAME} !-f
    ( b; Y. X' h$ r: D
  13. # e2 L6 m0 _  a& |/ |  ^
  14. RewriteCond %{REQUEST_FILENAME} !-d; j: a4 r# r! p# O
  15. ) Y/ A% Y: l3 P* J3 O
  16. RewriteRule ^(.*)$ blog/$1
    + P# M8 x# o1 D+ x7 [6 |

  17. ( C$ O" r6 D5 [, s7 [
  18. # 没有输入文件名的默认到到首页# b, V2 n9 c4 k* T0 z' f- c! w
  19. & Y; ~' H- a/ o; n1 \9 U. o$ E9 r
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]$ N8 ?+ c' c! `( O) B5 t1 [
  21. 4 Z$ Z3 r% z) T5 u6 Y
  22. RewriteRule ^(/)?$ blog/index.php [L]
    7 C& K. m# l2 B, y1 v1 t
  23. * X* T6 R' @3 u9 `  F- D0 W3 N
  24. ####end####& o) b1 [* D9 ]1 E
复制代码

0 o1 Q% b# j# z" Y9 {1 H& |: }6 G, Z7 Q9 N

7 m; ^: N- z, Q$ z
7 T6 s6 c, p6 M. z9 S( @
8 m1 k  R7 v: ~1 H

- b0 X  {$ M8 @( B

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思# Z& V$ V( {, I, T" k$ F% Y

( t" N5 C$ t5 f防盗链的语句,同样需要添加RewiteBase /,如下:1 k8 d9 {1 g7 M- g4 p9 Y
1 t, U3 v. x5 I# o2 v9 t

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

  1. % G. H( @8 y  H1 v
  2. RewriteEngine on5 Y* m! s  T, o  X1 A6 R( _

  3. ( g5 t: ^- q' c
  4. RewiteBase /% _" p/ j  j2 W6 f! ?/ p. Q1 L! C) \

  5. : j* L4 L' |% G! _7 M# a
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    ' E: q% |, P6 U3 {( _9 o6 p) G0 S
  7. 5 j) Y; q9 `4 t3 e6 c+ [
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    . g4 [" e! x7 Q+ ?* @4 w

  9. ) j" w. m) K5 N; n; Z: G/ C
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
    : Z% f. _  S- n1 B
复制代码

* `) d, ~) D( E/ t5 F+ Q( v) O5 f% b7 T& _8 p

2 }7 _- I* t5 W
* E! N. g+ v; X5 m/ D; T5 ?  a) Z

$ ~; k1 n8 y8 Q6 N) ~; C. u

2 @$ v( m. a) S( o

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。+ k2 J8 G$ @5 [2 x8 }

8 U$ u. F* k  l; ]/ e& @下面附上简单的语法规则和flags:( g/ w0 F, U& c
【RewriteCond语法:】# i: K! L* ^2 E
RewriteCond TestString CondPattern [flags]- U' ^3 n; y4 b8 R
rewritecond的其他用法:
2 w- ^6 V' S1 V, s. A% n‘-d’(目录)
3 y' C  v0 g' }' K# w将TestString视为一个路径名并测试它是否为一个存在的目录。: _. m& r9 }; @, v3 D
‘-f’(常规文件)
& W6 h- ^6 ]% L6 T% j3 X将TestString视为一个路径名并测试它是否为一个存在的常规文件。
2 {! [4 d1 e9 j$ ~. d  J( i‘-s’(非空的常规文件)4 F! M% T4 b: r/ J2 E' l/ x
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
& ~% G# h( ~* F9 i2 o‘-l’(符号连接)5 E* h" y& Q! X7 s
将TestString视为一个路径名并测试它是否为一个存在的符号连接。' ?  b" F" ~5 C! x" H
‘-x’(可执行): S& {- a) `, Y( u. `, u
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
" O4 B# m# B  F$ m2 R, a/ R‘-F’(对子请求存在的文件)
7 Z( r% M8 g/ O- L/ Y/ f( d检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
# t2 o& n' h. u) u/ U/ _‘-U’(对子请求存在的URL)
4 x$ _3 l! X1 ]8 |检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!) x9 p. w8 [; Q- e. G1 S' D1 u+ G

  }$ i& Y) a2 K. F1 \【RewriteRule语法:】
$ L( i. u2 y+ L! L; F& {0 URewriteRule Pattern Substitution [flags]! ~" \0 S" c5 R+ ]6 n

2 @- J! Y( Z9 b/ |0 w# o9 G% I【flags】:
0 Q- {! K1 t% U# V. b9 J2 [5 W- F. L
‘chain|C’(链接下一规则)
9 C; }, y& a) ]此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
4 v( a+ f+ Q. z5 J5 v" |3 T5 r- i, k  D' l8 v2 v7 @
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
8 h' S: L# @: u在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
5 w3 r( M" [# S2 g" G; e) @, b( Q) @+ j' f  j1 u7 v4 P
‘env|E=VAR:VAL’(设置环境变量)4 A/ U" E2 c. M1 Z) U3 A& |6 p
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
" C8 D& Q- ^+ N" @: b# p; M2 U3 u8 I( [9 r' ?
‘forbidden|F’(强制禁止URL)3 P6 R9 p0 x% d1 S
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。2 r8 o' N* S) q# y7 V* h8 z8 ^

* h: k, t- \% M5 w‘gone|G’(强制废弃URL)2 q+ N- N' X3 w- @" q7 Y+ [) Q
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
7 L8 `. P( O' R  y4 C! E. j5 t
‘handler|H=Content-handler’(强制指定内容处理器)
/ H' _( T2 ]6 A0 s; r& }0 d- B强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。+ {7 ^; M8 K0 o* |9 s) g9 W
) n0 o- r' o/ ^- _# ]: h
‘last|L’(结尾规则)) ?% e+ s6 a+ g( a
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。. c- d$ ?( J% J9 O7 Z! m

! y- G0 j* d" ?3 Z/ R7 ?‘next|N’(从头再来)
' |& H9 h6 S% Y1 S: X重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
+ a5 h7 C4 I& g. S4 R9 G7 l+ O
8 T* h0 h% C/ n+ @1 u: m‘nocase|NC’(忽略大小写)
2 X% ?( P& B$ U9 o# e. G0 n它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。: ]1 b' x+ A/ P0 ^& f

8 c/ m$ h; U( Q. U2 S' ?‘noescape|NE’(在输出中不对URI进行转义)
/ T5 E. [* M3 L. e此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
1 v% p. S0 Z! t2 t2 {  }RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]" A2 G1 i- C" m1 r
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
' Q. E: X0 i2 c$ {; H- w
0 C# ~4 n! e3 Q% H/ n9 w; V5 _‘nosubreq|NS’(不对内部子请求进行处理)* ^& y- v& \' M; m+ y1 x0 g
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。5 X6 x9 ^) R8 [' p& i
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。  Y! D; o/ `6 u; F& _
+ E$ I+ J( C, k  O4 P) w" C7 T
‘proxy|P’(强制为代理)
0 \0 R2 n0 ]8 W, ?3 ?此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。4 {9 ]7 q7 v+ |3 \6 s
注意:要使用这个功能,必须已经启用了mod_proxy模块。8 H+ W! a2 N: ]/ T& \

( N/ s. k+ B/ j; z‘passthrough|PT’(移交给下一个处理器)- O2 q% D* j2 z6 h) n0 @: c
此标记强制重写引擎将内部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,可以这样:+ n$ w$ J8 o1 p/ ]
RewriteRule ^/abc(.*) /def$1 [PT]
; C6 }) F: s7 j9 I2 d9 hAlias /def /ghi
, d7 _& U1 V. S. U8 x如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。' s, u9 e' t3 Y1 \
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
5 e( ^1 y9 k6 u# G. k) V
2 _; c. K% x! ]‘qsappend|QSA’(追加查询字符串)
$ i- X* E" r6 F1 b# ?' y4 M此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
) Y. L& N2 P2 [" ~, ?/ ]* O
! P4 L* A) }1 w( |; g‘redirect|R [=code]‘(强制重定向)
% b) y4 D8 I8 S8 T8 g- d3 h若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
7 `  w9 _; i# Q注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。' f' }) L; |; ^8 @, a

! j7 s' s* K3 @9 b’skip|S=num’(跳过后继规则)! ~3 r) O& E- ^: y" K
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
9 Z7 @5 k: p+ a# l  ]0 k* ]. ]
& z2 s2 \5 C. d& f! f1 [. ^‘type|T=MIME-type’(强制MIME类型)$ @# R( ^& k1 P* l- q8 e& \5 w
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
# u: x5 H- o  nRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]" w6 g5 [8 F6 }0 b& j5 d5 k5 \$ j: g


/ u, k2 d7 f8 |! @/ S. b

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


: h% l- g# x3 l

一、防盗链功能& V: ^' f. r# H( S1 k

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

  1. 5 L) k/ o- k! b' p, ^( n
  2. RewriteEngine On
    4 {7 I# j7 O' h6 ~* ^0 C

  3. 4 }0 ^5 g( P8 S+ o! T
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]! G" d4 n6 B, I0 ?0 `

  5. 4 Y! C& k4 K. ^( }4 ~
  6. RewriteCond %{HTTP_REFERER} !^$
    # H: d5 C* l" _- d1 k5 K
  7. ! n6 B2 i8 Y& s3 y; n
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]2 P7 k" R+ N# R
复制代码
5 K1 h2 h& U3 z# G

* d2 t+ l8 a; ~. A
* R; w8 I% }4 n7 o% w2 c
* E2 W5 |# i9 W8 p
) h: y8 |6 M: }( k6 s7 W0 g
% a' G* w1 c$ D- d- v" t) G0 |1 t5 g

逐行讲解一下:

/ x% s& o9 t9 f$ R! k1 ~! G

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

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

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

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


$ ]- u2 e% k& Z# S

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

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

) b5 G# R' a+ r; W* l5 y

RewriteCond下:

[NC] 不分字母大小写

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

' C7 F& `% M4 g$ N/ j4 X. j* i2 K' ]* z

RewriteRule下:

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

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

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


$ _3 M2 @- B% N( c' d9 ]. n

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm( T. W6 N2 A* M; y( }; ^2 ]/ q

二、网址规范化

[size=1em][size=1em][size=1em]
  1. % t' |  Z3 U# D: [; u2 B7 C* D% X
  2. Options +FollowSymLinks7 I* v9 J% D' e/ e) b; b

  3. * x+ m) }% O+ k' m0 u7 ?, w
  4. rewriteEngine on( i% K/ w9 K' y

  5. 1 j) M1 v0 F* m
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    - h8 |# y6 [$ i/ A
  7. 4 ]2 @% S) C4 s, D$ U
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]. k, ^/ C8 y" H" A: t2 Q
复制代码
! k4 b0 Q: R/ _& Z) S, R* p+ Z

& c7 C$ q. j0 _0 T! S" l
, `5 m! w- t' k9 E9 z

: ~& e/ a8 S2 |0 a: g( b9 j; K8 d1 J
! W& y. J$ q6 t/ E7 T

  F: D; h7 Y* K6 L& j, k4 [2 }

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

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

3 }8 q( k9 y' X, I/ S- Q. }2 x4 H

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

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

  1. ) u$ |7 W, p! c( e8 f  B- `( \
  2. RewriteEngine On
    2 X. i: i: [+ x/ _
  3. - ]2 b. Y$ x* L/ u- B$ ~0 f7 `
  4. RewriteBase /9 l3 ^& b  F2 z/ |0 k) r

  5. ) Q0 t' o& }3 G, ~( h/ ]
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    6 Y6 w4 u. y/ Y5 `; ]" C* ?& A, A

  7. 5 a- `9 j4 l/ j
  8. RewriteRule ^ http://abc.com/ [R=301,L]0 a5 f: R# O! L- X9 g
复制代码

* }" L8 v) d2 M: ?1 ^) u7 h" o! ~1 C
  y& }5 |. h) L3 s4 I0 U
7 K. v' w6 }9 r  ?6 ?# {) Z

, g: R& i: s' C8 n; k+ u# \: S& T/ T3 R3 Q3 C# S" [5 T

1.打开Rewrite功能。

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

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

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

2 K$ B: t, ]0 H$ P" k

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

. N3 {; ?# j$ m0 v) |

三、临时错误页面


9 V1 T" }7 q8 c7 r

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

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

[size=1em][size=1em][size=1em]
  1. 3 Z9 b3 C/ I% i/ B3 C4 q0 m% S
  2. RewriteEngine on
    # ?1 b+ M: u2 N+ ~* |$ Y

  3. $ B- d6 ]; c4 d$ U. m& M0 D
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    2 j; p0 Y% h, Y( i7 c
  5. 8 v6 F! o# u* ]& n1 j
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123, a* `. b2 c6 u/ i; W- W# |+ P
  7. 4 |+ K2 L) ^( }; W
  8. RewriteRule $ /error.html [R=302,L], [* H2 ^7 l; l
复制代码
) S% Q) p* [0 y: p4 R, L. X# W

' {3 G- a) q! m* f! r, {

$ k7 b0 g% D( H* R# D, [' y# s; e" b/ U0 H. x- @- Y

7 C- P; b# \# T4 S1 W! w
8 |0 _! x2 {6 U! s2 v

1.继续打开Rewrite功能。

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

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

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

3 i. v+ t. h$ V5 x9 e7 @% j3 c( c

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

1 \% J. x1 \/ t: C0 F

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

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

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

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


# j, J, P6 D2 u& s

^ 表示正则的开始

$ 表示正则的结束


) u9 N% q1 f: M% d3 I; c

四、重定向RSS地址到Feedburner

* o; E: W* T" g( E1 h

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

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

  1. * M  C, O4 e- L
  2. RewriteEngine on: F. t8 O0 G2 m+ c
  3. . P1 e* V0 V2 H
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]& x; |+ s* Z; H1 Z

  5. . A, h* Z( _- m0 N# I% g
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
      s9 l( `% v, r( Q

  7. ( S/ C. r7 Y! r, x- h
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]. m- Y5 _# H6 J( ?# i* |
复制代码

: p# J  I9 K) @: r1 w0 S- Z9 ^
) }; g/ u5 L0 o  Z
2 \4 }" d& c0 u% y3 N' ]; u

3 J, `- R; l' ^& d8 a# o- M* i  g7 ^4 R6 Z, Q7 G

( d5 G- d0 z$ u5 e5 l/ B

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

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


3 m* u' Z8 r7 w1 n- |4 m/ p8 b

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

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

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

& f' R8 b7 t# }7 }. s: |
2 W( X9 u2 }0 @" K0 j2 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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