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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:4 }* x0 C' e/ ^) k7 V
! t1 H* u! B& F0 ]1 a$ A4 r

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

  1. 8 ]. m3 s# d  L7 j; [! a4 ~
  2. RewriteEngine On& t2 c- F0 [) A. g' ?* Z
  3. . T8 S* d' Z2 @9 L  a' Z
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# Z8 G9 F, d4 W- T* d# A, @. V

  5. . ^) x; R4 `) f( h" K$ N
  6. RewriteCond %{REQUEST_URI} !^/blog/& Q( n9 _" l5 [$ q7 o5 Z' n
  7. % G5 ]1 I: ^$ p' H: h4 Q5 F
  8. RewriteCond %{REQUEST_FILENAME} !-f" Q  R0 F" M' J- R7 D

  9. " v! }$ l7 i/ }
  10. RewriteCond %{REQUEST_FILENAME} !-d( F& R& i, Y6 u- ~- }) m
  11. ( D# A3 k0 U% q  B" T
  12. RewriteRule ^(.*)$ /blog/$1
    6 y0 E! Y7 B9 R% s7 z& S- L
  13. 0 T9 u( L; d( J
  14. # 没有输入文件名的默认到到首页
    & m# U. c0 \" F; ]! @1 }
  15. : C5 o  y/ V1 O) G2 G1 b
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    3 d- m" w& _! b2 O

  17. % g7 d, m# N. a) z8 n% X
  18. RewriteRule ^(/)?$ blog/index.php [L]
    ' ~7 S7 U+ v& {- g2 C2 |
复制代码
0 b7 M3 I# K2 X: W- d

( l+ V0 G" B8 m' r
; p4 [- Q2 }  [! b1 L( t

$ m4 S; y1 x  P" Q

- B7 {6 W6 P- V$ R5 m
7 m$ e4 ?( u. k. _! w

下面我开始解说一下上面的意思:* \% j& {4 ?! Y5 j6 d" B  A- h$ E
8 k$ i% M( R, O- H6 e
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
6 {  z2 d* n. T8 m9 \( o6 D( i, n
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】3 o+ y% p- L! V  n( e4 E$ s, P
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。: S9 c7 Z/ f- ]. z- q
) p6 |& }2 f: G+ N$ i' I
【RewriteCond %{REQUEST_URI} !^/blog/】+ X8 e" M+ W0 b8 g# W. _! I
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$, ?8 d! ]# _% p

& L% ~7 ^0 q, g6 E  Z* w* j7 }【RewriteCond %{REQUEST_FILENAME} !-f】, b% p% A& w- \$ K$ e
【RewriteCond %{REQUEST_FILENAME} !-d】9 [" b- T6 e' ?
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径' v2 O. j0 R7 @  v/ B7 [

% N3 c8 V* `2 E7 C* H. [【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。( w+ v9 _! o- n: `

- H/ U/ J5 V% p5 ~: c7 |) Z1 A【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
/ u7 u0 g4 h4 C4 X' z【RewriteRule ^(/)?$ blog/index.php [L]】  e$ {6 P! a# D
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。% l* C+ h; Q; Z! Z& g: D
* w& ~1 w! a3 q* p- a' Z
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。* u/ F9 k1 Z- d' d8 G  K
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
+ L" o! T& J* qRewiteBase /$ G- t% a* f8 C

6 [% r  E2 ~( K0 o还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。
6 D! |7 U) |/ S1 @8 z% Y至此,完整的语句应该是:
1 I2 N$ x2 i5 [, |, A9 z8 X9 j" G! f* S) I) k

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

  1. 1 w% [4 A% E+ q3 M6 B( C, k$ }' o
  2. ####start####
    - u4 g, D* M6 i; N/ v. j4 a& I

  3. , b1 ]; g5 A5 H$ g
  4. RewriteEngine On
    & Z& {; W/ u/ ?1 G8 G) ?- Z

  5. & g$ b6 m  p4 Z. O  ?/ Q, I2 \
  6. RewiteBase /0 D  f+ Y+ p6 T* e* {! P
  7. 0 m* s; r9 _$ _/ \
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    + M! W$ M( ?# c( E- _
  9. : \" v, Y# d' {: W9 K4 B
  10. RewriteCond %{REQUEST_URI} !^/blog/. L3 s* N0 }9 e+ b3 d" r
  11. 2 j& ]7 g2 H( m1 j* a" M1 ]
  12. RewriteCond %{REQUEST_FILENAME} !-f- Z3 P0 l+ E% l. @$ y" S) V

  13. + W4 |0 o- v0 E* Q
  14. RewriteCond %{REQUEST_FILENAME} !-d: ~( ^- I% |$ a" |( [3 J# }/ h6 z
  15. - o7 q1 w3 _9 j6 t1 N
  16. RewriteRule ^(.*)$ blog/$1. v" D; M9 E1 h4 B- i# D

  17. " q/ v: P* ~. B1 ]  D0 A0 J
  18. # 没有输入文件名的默认到到首页
    ' q+ u/ P2 O4 v: j

  19. $ a! C# o8 D- E' z+ J% k5 n: G
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]5 `0 u3 A3 S1 p  a4 r

  21. + B. L; @) O$ F5 ]7 b
  22. RewriteRule ^(/)?$ blog/index.php [L]) _8 n: }) h5 X2 J4 @" r
  23. 1 e- I( s6 ?8 t: h. M
  24. ####end####( r5 E2 V, Z; Y3 F0 H6 @7 O
复制代码
7 U" W; b+ m/ J, @( `% V

+ \& O0 ^8 a( D3 B

6 ?, d8 \8 N* B% O4 q
* X( @# E8 q/ z" B9 s3 Y

' _& z( W9 K. F' _0 z
, c8 A# e& `$ g/ U; \1 H

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思5 `+ u2 B* g9 C6 [$ z0 Y' q! N0 L
6 W0 |, G& Z" M- j9 ]$ \8 T0 `1 u# l
防盗链的语句,同样需要添加RewiteBase /,如下:
/ h! {6 N& U: D1 T7 M, u9 w3 J5 l; k/ T# h; v

[size=1em][size=1em]
  1. ) V- H$ k" f$ U* h9 a# n4 y6 S
  2. RewriteEngine on
    8 V6 w0 g* O$ L7 A' P
  3. $ J; }! B) t: t2 t) Z0 l7 C$ A
  4. RewiteBase /
    # h4 s6 W4 ]9 z# c: H  Q. Y9 @
  5. " q+ z1 {$ O) `3 n& A& d7 E
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]5 w& I8 t; z1 o1 [0 P4 b

  7. + v8 ~8 k) y; p( V
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]; V3 z* n5 |- p7 `5 x! E* V

  9. $ v7 {6 I" ]8 q
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]/ a" m& m" r9 P% T  X
复制代码
, G4 P' m! V+ y! B1 L8 J0 s8 z# O
& s# k7 B5 ]& X& l1 y( f
6 c& N+ ]% m+ j

: O4 ]$ H8 m8 i0 l' X# M4 s  M6 {
. @/ `8 C  c2 \. R; e3 O" ~  o

5 O' [% k( N& J

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。2 p( b3 N" u2 w4 ]5 B( B5 ^$ Q
+ [: V9 ~- o0 E9 \$ Y3 b) o
下面附上简单的语法规则和flags:: l$ ~8 ~# ?! p5 ?! o4 P0 I' H# v3 g
【RewriteCond语法:】! y7 F, w* y1 f3 a' `! }/ n3 f
RewriteCond TestString CondPattern [flags]
8 f6 B  X1 h' P  v6 {! J8 n  Y% Urewritecond的其他用法:
! \2 J" a0 t' ^1 X1 [‘-d’(目录)
, W% ~4 }% @: T  n将TestString视为一个路径名并测试它是否为一个存在的目录。) x8 ^# M( h. ~/ N0 W. [- o& B
‘-f’(常规文件)2 u9 H1 Y4 |7 Z+ B- m8 e
将TestString视为一个路径名并测试它是否为一个存在的常规文件。0 _5 _. y( Y9 Y+ W; }
‘-s’(非空的常规文件)
: T, b- P! q3 |1 C将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。% `, Q+ Y+ o# H1 [4 _# ]. z
‘-l’(符号连接)1 `8 B( p, k' O( {4 m9 c/ z) d
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
, W. `' u& E" {9 n: V‘-x’(可执行)7 b+ M$ M5 b9 Y( v: u2 H( W9 ~
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。, t6 i4 X- E. i' x# z
‘-F’(对子请求存在的文件)" D! p9 S0 Y! X; P
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!3 {( O" N$ i: E
‘-U’(对子请求存在的URL)
$ V0 R6 p2 K2 ^: a. e' n检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
- j. \4 o2 c+ X* m3 t; F8 b5 @
  |8 f7 h" W% E【RewriteRule语法:】& x0 _% G5 Z" g1 s4 L
RewriteRule Pattern Substitution [flags]8 Y' U+ h$ J% V/ x; r$ }0 I

/ K- W/ [2 c& \+ L( V) @  T【flags】:. R9 ?9 ^6 F; I1 y

2 K+ l$ X0 G! {, N6 x4 I' l6 d  C‘chain|C’(链接下一规则). g$ X/ |# B7 X+ p
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。6 v' T# \* K, E7 j8 \9 Q' B
8 z" u0 \; l. P3 ]5 |
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
# O& Z" N( |, x5 O- W在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。: v: l5 g0 ]) h, @5 Z! @

; i* ^/ ]1 t0 B5 L‘env|E=VAR:VAL’(设置环境变量)
5 @6 T3 i) D$ B此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
1 K! W+ j: S' _# e
4 e6 r, y$ [" }! z‘forbidden|F’(强制禁止URL)6 n) a% s% |  }- n
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
9 ?9 _- k6 r. w) \: i3 W. ^
7 S, c: l1 e) \" t( n‘gone|G’(强制废弃URL)+ Z+ f0 f/ I% w
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。- K) n' K: w$ |" y

0 h# T& u; A- y2 j‘handler|H=Content-handler’(强制指定内容处理器)% q/ ]- K2 Y# o$ o  u) O$ g4 I
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。+ B9 D0 t) @) Y/ W/ r6 R

* _3 W6 g8 A' ]9 E% K1 c/ d# O‘last|L’(结尾规则)2 n" ]# G# U$ u8 `: ~9 S
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。  m3 b& C1 `; R% N' `- G

+ _0 i" r6 N: F‘next|N’(从头再来)0 g$ l0 F5 w" D' g! V( u
重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!# h" f% @+ b2 e1 C

# o. S+ O: S3 _' w% v1 D  X4 ^‘nocase|NC’(忽略大小写)
4 L% @$ S: o8 r& L5 k2 y& V它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。! q+ d/ @5 a% v% I. {
% X2 }% Z7 Z! Y4 ^
‘noescape|NE’(在输出中不对URI进行转义)$ N; ~4 N, L7 u6 O  N5 Z1 ?$ n
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:' B" J- A9 W+ t5 t, X  S
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
' C( A5 S# J" l. U可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。5 D" S" G$ W* X) ^! _

/ \( p1 e1 J$ [, q. M‘nosubreq|NS’(不对内部子请求进行处理)
- L7 L# I* ]& Q+ a# t在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。* I8 `1 l* ]2 {
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
! n- _& y  I1 n1 Q
" V' t: p" I+ Q1 Q7 c; e/ g‘proxy|P’(强制为代理)1 h" k2 g/ X% q; k
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。: l$ G7 f  J$ {6 O/ D# k
注意:要使用这个功能,必须已经启用了mod_proxy模块。
5 N  @" _* ^; Q* N, Y2 s/ O
' V* ~) i% Z' A  C+ x! ~) m‘passthrough|PT’(移交给下一个处理器)
( \2 Y0 G0 h; P5 z此标记强制重写引擎将内部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,可以这样:+ d% A( S. u  _* ?8 ]+ ]9 }/ |+ y
RewriteRule ^/abc(.*) /def$1 [PT]0 ^. h. z5 j1 y/ F3 [
Alias /def /ghi3 c/ P0 B$ P4 n. u! C; k
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。( ^5 T+ S. J! m8 Z( c4 Q" N0 A
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。2 l8 _* R$ Q* w: o
3 G4 S2 H4 g1 i0 m! O
‘qsappend|QSA’(追加查询字符串)' l. B+ |2 k. o/ l) N
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。' x  h: e1 ^! o* f8 J/ y: y/ z
$ T% P* I% l/ [, B
‘redirect|R [=code]‘(强制重定向)
0 L: c" d3 A* ~1 _0 A若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。: p3 }, p2 m9 `/ |' R0 y
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。0 p8 {- t! @4 [5 Z; Q9 O- }
# ~6 [# u3 X* t) J- q
’skip|S=num’(跳过后继规则)
( Y% I. X% j* y0 p5 ^此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
2 A# j* R3 @" N1 t0 w; }
9 s# ~, w$ n" N, ?( q9 o5 Q‘type|T=MIME-type’(强制MIME类型)
, `6 C% T1 |$ P4 S强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:* t' o6 A% X, a, P# ]. S" W# n
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]) r- ^8 f/ d4 e


6 O8 |4 D9 E4 v; l% Z- t

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


' l* s/ k- c' s2 @) {' m

一、防盗链功能
$ C5 q7 y0 U. b5 ~5 \

[size=1em][size=1em]
  1. # t1 _3 [9 O2 i+ s; P
  2. RewriteEngine On
    ! o# C/ b) J/ o9 [5 f

  3. * f3 i# G9 x& u
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]1 b! A7 F( y! v

  5. ' b3 _$ x7 W( C" {3 @3 Q
  6. RewriteCond %{HTTP_REFERER} !^$
    + |" L3 z' |* `; K, L

  7. " O5 x# b! m; q' B% z% f* e
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    4 T4 T3 m6 b* F; i' z- N
复制代码

) C. T5 i1 p3 J; Z9 S) v9 y  {
- E: x& c8 A5 ~- P9 \* U7 s
+ H3 t% o. W+ `* g0 \
1 L' C* F. Y7 S9 D- b1 [" D# C
% d' K/ i3 _% @7 e+ _! h
! [& B8 I, \. x9 J

逐行讲解一下:


- n) V& v5 D0 D' h9 Z9 S

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

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

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

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

4 j* ]9 A7 o4 o2 t) N8 k0 Y+ N

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

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


9 u) A  }0 t9 N0 M0 m

RewriteCond下:

[NC] 不分字母大小写

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

! p, P" F% F8 _/ g% X

RewriteRule下:

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

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

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


9 j2 N! Q; P4 s

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm/ t  X9 F; Y" ?! ?4 @+ p

二、网址规范化

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

  1. ' S# R: x/ n( w& w$ V# p5 b3 ^! R
  2. Options +FollowSymLinks( X0 x5 R1 D) K3 x& j% b+ A

  3. ) o3 M* d# M8 U! O$ o7 [/ u
  4. rewriteEngine on
    ) a" v. D6 n$ r$ O7 A8 K6 F

  5. " U6 R1 i9 ~) V( W
  6. rewriteCond %{http_host} ^yourdomain.com [NC]- M& B: f+ l1 S8 [2 `4 r: E8 P" @2 S
  7. 9 a. }1 x7 N+ H+ W2 A9 f
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    : o5 Y5 k7 x& h) q: k9 R* |
复制代码
) c% C: y2 a2 n
/ X! T! L! Y& M/ _! Q
& b  n: i' q4 z6 T% O2 l0 D+ {5 o
2 O( Z. L, a( j% ]

" b# f, T7 C  w6 w

" b; ?& C0 d! [0 [6 c( t, I) ~2 i

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

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

" `" I- q& r$ @$ ^/ \3 c" j2 s

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

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

  1. 7 @3 C+ Q9 m- o
  2. RewriteEngine On7 g( Q3 |1 ^) k

  3. / e& [7 C" B# M0 Y! x8 h' k- V
  4. RewriteBase /
    # B3 Q; e0 V0 D. q7 v# _- K8 C
  5. , r' G$ n/ @- h6 i8 L: G
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)5 s- K: l. y0 e7 a
  7. ) c1 [5 O* }  T, f( i7 G  Z' R
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    5 U; ]3 @" n. s  x6 _) c
复制代码
# L" b7 J+ n1 H# W  f# K

. t* ?2 V. V. V) L; q" A

( C& R1 [' e7 Y4 x& b7 w9 k) n8 M8 j( g! n

8 G' H0 o# ^: H$ E& }  C+ k4 V& }5 B* ]

1.打开Rewrite功能。

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

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

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

& o0 x& w* ~3 M+ W8 V2 P

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


* Y% [0 ^& P+ m( n: H7 ~

三、临时错误页面

; Y! v4 I  o, I

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

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

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

  1. ! Y5 o1 [7 B  c! R
  2. RewriteEngine on- u% E  k# q/ R- x6 ]6 v

  3. 6 R. k; A: P: v
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$& E, \- x% H& ^" B5 y, N# g
  5. ; S7 ]# ~) c1 d3 S' e# |
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123" g; w) |& v6 \. w! N0 ^5 C" P
  7. ; J# }$ ~' W$ w4 z
  8. RewriteRule $ /error.html [R=302,L]
    % X" w; d1 @( ]0 v  C
复制代码

; N, A% N0 z, G8 j7 u( X1 n3 s' j$ d3 l( k2 i: G6 ]# s2 K3 D

" ]1 W. x: d, W# X% `/ q4 \
- ]  V; A8 v8 [5 u6 R9 t0 \/ V6 ]4 W+ w' J4 @# r' \4 E0 c. h

, Y4 j0 H  L4 ^8 S. b

1.继续打开Rewrite功能。

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

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

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


8 R1 P( H& D* T  k5 O, n

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


0 u' p! B: L$ x: U. M2 U) Q1 n( D% |( [

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

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

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

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

7 Z& G9 w: ^/ d

^ 表示正则的开始

$ 表示正则的结束


" T# C9 k6 ]3 ?

四、重定向RSS地址到Feedburner


' p' F- l. p6 x' Z

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

[size=1em][size=1em][size=1em]
  1. 1 b2 s  ?4 H( A0 Q. H2 g
  2. RewriteEngine on
    4 C$ {2 r+ }* ?0 y& z# Z$ X
  3. ( k, ]5 j9 x8 B' E
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]/ ^* R. M. {8 t+ ?

  5. ! V# T! ~, Z- Y! ?% v, b( A
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    % @( H# j: S$ I8 l% ^( z: P
  7. " z) }$ [; ^- R! p- \; N
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]9 I) x! ^- @3 M5 q: t
复制代码
: N+ p" T0 t& ?- }! q
) q1 ]) P3 H8 n# z, R5 Z

5 }* i* }* ]( I, y8 }4 ^1 x! m$ x4 `/ {9 T% C# n$ B
2 c( _6 {4 W9 @6 O" m* R

4 |. _8 @: y! s1 O% w

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

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


4 N+ C' V* R4 c. V4 o* }

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

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

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

9 b+ ~; ]: W3 b# f5 R

( x; T1 n) J, [: e5 h/ u+ |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-9 13:15 , Processed in 0.132202 second(s), 19 queries .

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