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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
; `7 k% I; h, k8 z3 n) u
4 O" n/ b# d6 C+ t2 r+ R8 R- ^

[size=1em][size=1em]
  1. / t2 T: n2 o& I
  2. RewriteEngine On5 [* X, X% h/ m; x0 G

  3. $ M4 J2 L1 n) V( I$ X+ L: h
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    & H' x7 a+ P" L. u; n7 }' m

  5. . a1 x- O0 W% O0 ]" f4 x
  6. RewriteCond %{REQUEST_URI} !^/blog/) f0 }5 H5 n% f, W9 j8 C, ~" w3 ]

  7. 1 Q4 g; e1 O. h
  8. RewriteCond %{REQUEST_FILENAME} !-f
    + P  u: G6 b4 J
  9. . w$ S" i  n! |- b, K' J
  10. RewriteCond %{REQUEST_FILENAME} !-d
    6 y! c, S+ V2 v3 g; d8 z5 y

  11. + B" V4 y" m- }. b3 w, ]
  12. RewriteRule ^(.*)$ /blog/$1
    , w% ]5 f4 b) g1 z( \- h
  13. 2 Y( c2 P, A5 i: K; I
  14. # 没有输入文件名的默认到到首页" E* N( _* Z1 m! b; a0 G" F5 H

  15. ) Y- N. o+ i! D
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    4 b4 t. i0 J, M. L* z8 F6 h

  17. * S3 l- l# U& ?
  18. RewriteRule ^(/)?$ blog/index.php [L]
    5 N% {. j/ w& f
复制代码

! V) X6 Y. T# B" a. D
5 N( _6 T; }8 {. e
8 g. M' _/ f, y( ]
6 j; T' A- c6 n/ G
6 _1 s% ?, B5 o8 O

6 o9 O/ z! F3 y# f6 u! t

下面我开始解说一下上面的意思:
" s$ M3 k' h. ~2 d1 B5 ?
, I7 s9 ?/ S& Y" T# I3 l4 l5 ^' {【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
$ u& g4 {6 a( j! f9 s* Z
  |; u- c! R- g* W/ t3 s7 w1 _【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】5 e5 S2 J( W' V1 X  B2 R% W
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。3 `! n5 ^% k. R8 [5 O  t. X/ u8 m$ V
' y5 {0 @& E* K& `9 [! x6 ?
【RewriteCond %{REQUEST_URI} !^/blog/】! D4 I; i( N' ]; x
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$- c9 B& R2 v, a; M+ M0 Z9 G, Q# s

1 _: S) g# _: o8 [' v【RewriteCond %{REQUEST_FILENAME} !-f】' B8 }+ S  Z2 [; H+ t  S
【RewriteCond %{REQUEST_FILENAME} !-d】2 c+ x9 D' p0 Z- b) `
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
* M& Z  z7 d* Q" B! k. z
; S, ]/ N9 H0 Z# j9 J/ |5 J【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
* M3 w( _3 }" O6 {0 }% e
: [5 b* M6 ]  k" S* N【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
- b5 K% _) L9 G9 y2 W) L) S【RewriteRule ^(/)?$ blog/index.php [L]】
9 B: ~4 x& J9 q6 q( q0 Y这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。+ Y) N9 ]; A% ?1 L5 S7 Q% t' @/ ]
5 ]& Z; n- H8 k1 ^& _! A
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。
2 ^1 D0 L* E# t8 @  }答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
# j2 l- I  r/ c% nRewiteBase /  Z8 Z, L( K; ~) Y# n+ A# W6 u1 B

$ O8 e8 E$ }* [, k- l! U7 z7 s还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。, i( v* @* G/ L. a% V! W
至此,完整的语句应该是:
. o- }" f1 `3 }/ u  x  u( _' T/ y9 {$ n7 m% I' n( P9 g

[size=1em][size=1em]
  1. 2 Q2 W3 l! R- j5 J1 z, H
  2. ####start####5 f6 u# F2 H$ S6 a5 s" R/ L

  3. 7 [9 x8 g6 N5 B/ W  a
  4. RewriteEngine On0 g; u* I( X7 H- `  x- R

  5. 1 U. U+ E+ `* @5 X8 F, M
  6. RewiteBase /
    % g, l. d% w: t

  7. + w! m9 h) M- Q3 t9 X1 M, Q
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]) [0 ^/ X7 W- C+ v+ u

  9. ! r( O+ U  F0 Q# O/ \
  10. RewriteCond %{REQUEST_URI} !^/blog/1 s& f( }% ?" v' @7 c5 z

  11. % n. e7 {9 V0 e2 p
  12. RewriteCond %{REQUEST_FILENAME} !-f
    4 J' b, @( y- b7 o0 `
  13. 2 v! E0 ]3 r$ F* \1 x
  14. RewriteCond %{REQUEST_FILENAME} !-d
    2 Z" B( Z! q$ U7 r2 B* n
  15.   w! p1 D. P7 X2 e
  16. RewriteRule ^(.*)$ blog/$1
    + u. ^1 H5 O7 C: R+ Y
  17. 0 ~8 K4 A$ G* Z2 A! g
  18. # 没有输入文件名的默认到到首页
    : V' W. T) c/ L" K9 N# }: ~9 X9 l* |
  19.   r" f' K# i/ |; C4 l
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]. O# y! x+ O7 T$ y

  21. 6 H: Z9 G# }- u5 e* T, f
  22. RewriteRule ^(/)?$ blog/index.php [L]4 ~% t8 h$ \# J+ _
  23. * X3 O/ h9 K+ n
  24. ####end####0 L  K# O4 i2 m( h: f9 E, X3 R# M" z
复制代码
1 Z5 g6 s" b! c$ C) Y- G" q

  [$ `, a% K3 M: r7 c# G: N' i2 k" P
* O/ u7 S$ d8 x0 _3 _4 ^2 r

8 t- l+ C+ [1 C& h9 }7 ]

( Q% h, t! h& n* S6 J
+ b  i  @5 K3 G, L& V: ~

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思3 v, Y0 b0 K8 k7 k8 G; D/ a

3 t# X* ?* k6 \# u防盗链的语句,同样需要添加RewiteBase /,如下:
, _6 g; H. F6 V' j! t; z5 @1 g- E' F* b# d1 u9 y6 j# I

[size=1em][size=1em]
  1. ( d  Y- Z8 B- S
  2. RewriteEngine on
    % d0 f4 h9 u0 f: W/ k% [9 g8 ^1 e+ A" v

  3. - s  R7 I# E' y. }0 m# W+ W
  4. RewiteBase /
    0 j( F& |8 H5 R" L: k
  5. 2 R# |4 M+ V9 d+ S0 x9 ]* l
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    ) g5 S! D, f# V2 P0 D7 f# x
  7. , k$ m* k3 w9 R- z6 L8 q
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    2 w5 T. D8 _# j7 u3 L. H# T/ D

  9. ( I' Z# s4 G8 a' A. Z* U. C5 S: E
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]; O$ \) i" ~/ W5 `- k: n
复制代码
! s4 E) M4 ?$ M  h# b
! u- X. P0 A" A& R5 U; e- z
6 Z: e: m9 n* r7 ?

/ R5 }1 l) A1 D/ N6 z2 {

( f5 ~7 u) c3 I+ T1 e  T3 ^9 q) s

; o. w0 X8 [/ H6 I' ]4 w$ x

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
5 x6 _4 I, p4 x' O( `! I* u. G: D. r
下面附上简单的语法规则和flags:
4 s9 Y- h) k% v【RewriteCond语法:】- Q( }& R# t6 _* J
RewriteCond TestString CondPattern [flags]
. {+ T" I7 n* @  i, t; J  Rrewritecond的其他用法:0 p$ H* ?% y0 U) J2 d
‘-d’(目录)- B4 X6 \& {/ X' i$ J
将TestString视为一个路径名并测试它是否为一个存在的目录。. N1 u/ f0 ]9 A
‘-f’(常规文件)4 T2 C% f, f. w1 U
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
$ |0 y4 H; G/ S‘-s’(非空的常规文件)/ U! t0 m0 c/ ]6 `: O( a& y3 w* b6 D( e
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。; v; E# e8 D1 m: |& p4 K
‘-l’(符号连接)
  i' s7 T  `. R将TestString视为一个路径名并测试它是否为一个存在的符号连接。
: D  v9 c: D3 t9 B# `1 k5 P‘-x’(可执行)/ Y, Z  Y+ x# N; v5 r
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。/ [; \) G8 j. l) z
‘-F’(对子请求存在的文件)7 N: Y! F- [2 J; p  \1 b, q
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!; n# P* z& P& H: _2 L0 I9 U
‘-U’(对子请求存在的URL)! ~0 x" }& ^9 B2 P5 @& b
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
6 ?: M& _+ w" T8 A, `. C/ {2 ~# u) g+ J
【RewriteRule语法:】
1 X3 t7 u. m5 m; y  SRewriteRule Pattern Substitution [flags]% K/ C0 c, X' @& o" S

8 d+ i3 w3 ?0 Q【flags】:: {1 K/ Z. f" x9 Z+ D7 @7 ?$ g. ?

5 p* H' G1 f" m! ~0 u8 A, w) ^5 {0 M‘chain|C’(链接下一规则)
5 P5 G, J2 R5 M1 n此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。6 K/ c- A1 x6 t# h

: x: h) b" V* Z' Y‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)! k7 K/ C" r7 n, c9 v! A. x' o; T
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。) t# @! y2 N0 h# o

- ~( ]4 h* _. H$ Z/ s1 Y: s! ?‘env|E=VAR:VAL’(设置环境变量)/ M6 W) X1 m+ M5 p3 \# {) Z
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
# Y6 J( s4 s6 B7 L  k! S2 V% o
‘forbidden|F’(强制禁止URL)3 t" n! |* V* A  Y% J
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。1 Q$ n- g$ g8 }& O: s
9 R7 n, o* H4 v6 J' C9 }
‘gone|G’(强制废弃URL)
: x( l" q  Z$ y强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。8 ~/ k6 U* m7 C- b; \
& f; x  u* ?: e, z  V. |
‘handler|H=Content-handler’(强制指定内容处理器)9 X7 l3 Q" R  j
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。+ Q" |- e, s% ^1 s$ i

$ a! y" ]% o+ [) Z8 e6 `‘last|L’(结尾规则)% f1 W% Z+ B6 T4 Z. |
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
7 H# k. M$ d& Y3 ?8 O; t
: Z' @/ C  O- W5 M6 J7 v' d) p( t‘next|N’(从头再来)
+ T* g; O( w% p! d重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
) h% x8 A) Z& M; O& K& G
8 y7 M- z( D6 z" D& S' S‘nocase|NC’(忽略大小写)
& S* x, o4 x6 Y+ r它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。# {8 i7 v# r) N5 T% q
, ]& D; R) ~* t. r
‘noescape|NE’(在输出中不对URI进行转义)
+ D/ U5 H2 E- g, @# \/ x6 u$ S此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:
- ]% E/ V/ R1 X0 a; S1 URewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
7 S8 s: @* n9 q7 X" `可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
$ J7 F  j0 y3 K% }/ O/ a4 }' @' d5 z4 x3 N$ l6 s/ N# a
‘nosubreq|NS’(不对内部子请求进行处理)
: L1 ^9 Z. c: ]% }$ b3 G在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。4 E5 k$ Q* k3 X! X# i! D
使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
4 N. C( S: \1 Z- W& Z6 d
1 ?$ q* ^3 k1 O2 \9 v! B! G‘proxy|P’(强制为代理): Y' G, {6 q' q2 N# A( p
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。2 ]( j: W8 Y3 ?" v. j) \0 B
注意:要使用这个功能,必须已经启用了mod_proxy模块。' F/ [' e) Z- A4 ~
7 }7 K3 H  A$ Q( P9 B3 S
‘passthrough|PT’(移交给下一个处理器)) n% Q* @% i/ G$ M
此标记强制重写引擎将内部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,可以这样:) O' q/ S! Q# {9 S( {' F
RewriteRule ^/abc(.*) /def$1 [PT]! G- D" ~& X6 z! @& D
Alias /def /ghi
: R, e/ Q, {2 g& X如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。+ {; d. ~1 D) l+ W
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。& z$ X8 O4 X4 E# ^; v" @
1 T4 g4 ^3 w/ v, l
‘qsappend|QSA’(追加查询字符串)
* O1 `: v2 I$ K. t" ~* a: p4 w此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
4 _, @, r& P" D/ B3 r3 H4 m( u) e: p- F; s
‘redirect|R [=code]‘(强制重定向)
; B9 `- |: I5 T4 `) x若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。! U" V$ a% J$ k: U% p
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
: C) s# B; c; D; k
- ?2 o5 q: u- ~’skip|S=num’(跳过后继规则)$ _/ K" L- A4 h4 `
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
7 y: X' X, Z( y6 J" r
0 L- {$ M. ]" b& e‘type|T=MIME-type’(强制MIME类型)! y" [9 }$ h% r* L( ]1 ?3 j
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:' i5 g% _; P/ I1 ]( T+ n
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]& N, O; q, S% a+ p& W( z+ C+ J


! U5 l* `1 T" [* m/ \: q* i4 a

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


# s8 H& Q- l" n3 C8 U3 b9 ^9 \

一、防盗链功能; b- A. v! y6 [2 n. n9 Q) P- @' v6 [

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

  1. 9 p$ P$ |5 W6 ~1 A' t9 x4 z
  2. RewriteEngine On
    - G* l+ D4 T5 @
  3. 8 R1 Q: i7 W, B3 [
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]$ K/ Y( @6 S# H  e) w
  5. + N" l- w2 r+ y* W% e" r
  6. RewriteCond %{HTTP_REFERER} !^$
    0 _6 _/ w& B# Q. J/ s
  7. , ?6 R% r" n6 O6 V! p5 b" L, ^
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    / B" |/ }0 I* c' a
复制代码
/ l% W3 U2 }7 y" K: Y* x

9 z6 t1 T# g" n

7 Y) a( `, p9 `$ N. A
4 M) s' ^1 H) T6 |& l

% u' M2 X  I& {8 R

  l( z! X  u- l: @) c' ~% z. u

逐行讲解一下:


% a/ ~. u* N# j; {* S& ~# b

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

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

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

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


6 c+ L3 U; H: ^3 l

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

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

4 h2 |( S% N" C* ~3 g! }4 F/ z8 {

RewriteCond下:

[NC] 不分字母大小写

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

0 O: I  {0 a* i( O; D: d6 [" J. X; M* l" n

RewriteRule下:

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

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

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


' ?- j( n' E1 a) R+ y7 |' f" G/ U

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm+ h0 H1 C% J$ H1 \8 p9 \

二、网址规范化

[size=1em][size=1em][size=1em]
  1. $ l9 v6 f0 t/ Z6 H2 f  m
  2. Options +FollowSymLinks8 y7 T2 d2 }  @% o; w% p: }
  3. : G" h) I5 n8 Q2 \# Y6 y
  4. rewriteEngine on
    + B( Z9 z! d8 d* r+ {& ]
  5. * z3 f8 B; z( Q5 ]' r" g+ c
  6. rewriteCond %{http_host} ^yourdomain.com [NC]; X( J9 N  F& z* @
  7. 1 l& \  L' C5 a! i7 ]/ e
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    5 u9 j, X; Z8 p9 m: \& }
复制代码

0 `* |5 S+ B" D% M, n" r  M$ f/ Z, [1 [: K$ U- ]0 ]
/ ^6 |* G8 x) J# r" v$ h7 p9 _
9 t. a) ]( J' r  n3 M% h

6 j, `; E" Y) _4 l. E# `

& ?5 i1 u4 h& f' c1 R& p

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

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

' N# n% G0 W; p/ N

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

[size=1em][size=1em][size=1em]
  1. 1 ^" i; S& |1 n6 Y2 A  P
  2. RewriteEngine On2 a; p- I0 p# `+ J$ M7 E! F
  3. ' M* i& D& {& C, u& r0 M  s0 _4 W
  4. RewriteBase /$ I% o; r2 o3 J. K

  5. 1 |& a5 |4 w$ h- @# @
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)6 x* {! v5 m4 J

  7. ( j' o: |* s  Q  y) P& S# X6 F( u1 r
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    * i+ E9 x& c5 T3 S) m  e
复制代码

( F; r/ ~) f6 b. }1 n" D9 t
% w; p# L, ~6 A, h/ D- b& I
. c$ y4 V6 G2 o

9 j( h- j7 S6 x+ h* i: ?2 R: \$ v. _0 E  X6 L: Z1 }, l
* v; P5 ]+ Q$ O, g8 L7 p' I

1.打开Rewrite功能。

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

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

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

0 \$ O7 M* {6 z+ D: ?8 t

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


: U* N8 ^+ I. R9 k% e. j

三、临时错误页面

# C2 M: w. i* a! A

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

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

[size=1em][size=1em][size=1em]
  1. 6 O& X: Q3 k; t- z% h% @
  2. RewriteEngine on
    . X8 w# n+ c: C: H" t0 E; H1 r+ X

  3. / w8 F4 \- F" R( @3 ?/ G
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$1 n1 U$ F+ K( p4 d& F

  5.   M% l/ f: H0 v& D. m) j
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.1238 {- x. q  a9 G3 t  A7 x

  7. : U- d  s- C. @
  8. RewriteRule $ /error.html [R=302,L]
    ( w- R* N+ h. F4 W9 w
复制代码
3 f5 }# ]+ u% m* n  V* H

3 w. K$ ]  L$ g4 d0 j8 `7 s
3 @0 W- \- N/ N9 y
/ k: ]$ J0 x3 t# u- E
& @6 _# N, ?. H# k- C
( V! Y0 Y$ n8 f4 E" [

1.继续打开Rewrite功能。

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

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

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


( u0 i# r( j) G, z$ L

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


0 D/ }, F1 A3 f3 A. U

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

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

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

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

( I2 W  ^# D6 b" n( M( R

^ 表示正则的开始

$ 表示正则的结束


5 ^6 \' O9 Y6 ?5 s3 t

四、重定向RSS地址到Feedburner


9 S7 P1 B5 V0 Y& {7 G9 @

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

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

  1. % U0 Q1 L! @( W8 s, U
  2. RewriteEngine on
    2 D: Z/ x* z# r( J# S7 o7 }6 v& j
  3. 6 t/ F( j# @3 ^
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]2 t$ [6 X) o; o- Y
  5. ( c- P* g/ |2 v/ l
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]2 P6 _! w7 t3 o# F- j& ?% C
  7. 7 C' N6 S0 e. M  L4 P% i8 S
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]/ T" C3 e% B6 Z7 g/ F7 L
复制代码

  y, r5 ]# V# Z) f! f3 S5 ]8 f7 e! p8 C. K* D. h1 J* p
" U# w; k+ W6 d; h3 H; ~
- X/ J6 r; L0 k8 h' t2 F
* `, L$ [1 ]% C# {/ Q; J( H
5 {8 o5 O2 e$ n8 g

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

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


5 ^/ Q" b2 w, T) A0 i+ e: j- M" A

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

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

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


. q1 X6 r6 p: C9 R
7 b* |4 Q% B3 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 20:02 , Processed in 0.060056 second(s), 20 queries .

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