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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:8 j2 d' G- B7 W9 o! c
2 ]9 [. i( z& ?

[size=1em][size=1em]
  1. ( [/ k" W1 I" e  Y+ e0 T
  2. RewriteEngine On/ v: n! R0 r& t+ D: S9 Y0 X
  3. ) H$ Y- m! Q2 B
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# Q: z5 i2 C* n1 f) l4 f3 W

  5. 9 h9 Z2 ]( i: G/ E! ~9 Q
  6. RewriteCond %{REQUEST_URI} !^/blog/
    ( v5 r. q. |* q, |9 e
  7. ) R* E: {& e2 L  G" k1 w0 v
  8. RewriteCond %{REQUEST_FILENAME} !-f3 H% C5 ?, _- k( j$ f/ Q7 m5 O+ A
  9. ) l( k& t! Z4 c* q5 W' F
  10. RewriteCond %{REQUEST_FILENAME} !-d/ n8 N  d5 v5 s2 c0 R
  11. ! A2 P$ {6 X1 b; Z1 Z
  12. RewriteRule ^(.*)$ /blog/$17 L- D2 A/ S- U/ \

  13. 9 J; e- e* {# H
  14. # 没有输入文件名的默认到到首页! f5 `. G9 Q" h

  15. : _4 e- S% m' b& y/ |4 N
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$9 v, `6 \' O4 F9 }

  17. . }& H* Y5 j- m- h2 r# i  R. c
  18. RewriteRule ^(/)?$ blog/index.php [L]
    - x+ E; Z. b& }6 ]# q
复制代码

* W( x+ b7 d# ^
3 T! L; g- _  t) |0 X, Q
. x8 ^" j( i2 H9 D+ }

; G7 U( m9 v4 b/ W* k$ `7 n

. G9 x5 H5 S$ `8 {) u7 j! ^

0 v1 n2 [6 S  H1 B: A! h" L- t

下面我开始解说一下上面的意思:" Y$ D# \$ g# `! h  O

7 ]# w, b: p5 q7 a, X" r【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
+ N) o2 w2 b4 p6 a7 q5 [, _( G7 g4 D4 e; w: O% p! ~; @
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
& O2 g: X# e  A) _这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。) e# K9 z5 T$ q' w0 I+ D) u8 M9 ?
# ^  g$ H+ U7 h8 d  M; G# j0 C
【RewriteCond %{REQUEST_URI} !^/blog/】. L( S# ^1 X( S. U4 m
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$+ D" s: O4 s3 J: ^! g" j# i0 B

+ i# e, ?7 W  F  z$ j【RewriteCond %{REQUEST_FILENAME} !-f】
2 e( f' b" M3 x【RewriteCond %{REQUEST_FILENAME} !-d】% x" W# ~# e9 L0 d" S; G
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径" u' n9 F3 s7 I5 t6 j

/ A, c, R! ]$ W" }# {; M【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
2 a+ ~2 `, ^# G# I& o1 h, N1 w3 v' ]
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
0 n7 f1 f3 z! P% U) V& n【RewriteRule ^(/)?$ blog/index.php [L]】$ t& g$ f+ y# p7 U/ q' o8 s  X6 o
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
" Z$ x3 P  S# w0 Q+ Q9 p$ {/ W2 c; G
" Q# M8 O7 {" y9 M% u( M现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。0 x9 V, x3 b' P  C# J4 Z, ^( W' W
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:3 F2 @' P2 g! t- k" w
RewiteBase /% e- n' W( Y5 b4 _

6 S3 x2 @+ F' J" Y8 N" p* R还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。$ F# D( B3 i% M& e' s- }% l
至此,完整的语句应该是:
9 N" A3 A( b0 o7 U5 Z; Y2 H3 {; P. t' ]9 a  D: {

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

  1. 0 {: W$ g* k4 s
  2. ####start####" s- A8 O4 k: Q7 R* @. F: R
  3. 5 Z% g2 T9 E3 d
  4. RewriteEngine On9 N) q/ o8 s* H& R" Y& Z8 u

  5. 2 }4 O: D& `0 R: ^6 V# @: L# z
  6. RewiteBase /  Y$ t4 y: o6 m1 Y6 Z3 j( _8 ~
  7. 1 L" b, o  T) C2 c+ m& ^
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    - p2 t: g6 d+ z1 l

  9. 6 o4 N6 R- e1 I. V4 k# K# Z* ^
  10. RewriteCond %{REQUEST_URI} !^/blog/4 ?! H3 z2 b: a$ b: Q2 U! s% d: C
  11. 0 ?5 d" l; t5 B4 t1 h# N9 k" y) y
  12. RewriteCond %{REQUEST_FILENAME} !-f
    9 g9 l. X4 `1 @# P4 j$ m
  13. + ?) X, D% K$ B$ W7 k
  14. RewriteCond %{REQUEST_FILENAME} !-d/ ?, G3 H; m6 n5 F: `3 P7 m+ K7 H

  15. * [3 r' `% G/ d9 l: N3 G, Q% j6 Y
  16. RewriteRule ^(.*)$ blog/$1
    5 @8 T; g& d' T& c# F" m3 M

  17. & Q! I$ `! B; r' M! T' {9 E
  18. # 没有输入文件名的默认到到首页1 a3 T$ _! i# u& }2 A4 H& U6 g+ v  `

  19. $ n# X8 ]" D, P8 d/ U
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]$ s: z% u5 G! U9 G9 M* C( E
  21. ( I9 `% X: o& `6 r7 C
  22. RewriteRule ^(/)?$ blog/index.php [L]
    0 L( U  F) e0 B2 M% R
  23. : E6 r7 A! J  \1 o# d. V
  24. ####end####/ g! a! a5 O( s% W2 E
复制代码
$ l0 F& F/ k- x
6 a& J/ @4 H8 x% [! N% Q$ E

9 n2 B$ ]+ u+ H" H# H8 ?2 E. Y& p" W6 N
. s, f9 c# p" v
+ x  ^: Q1 p# I( A0 i: x

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
$ B" p- F5 ]: h( C/ F
  e2 p8 h7 b/ K防盗链的语句,同样需要添加RewiteBase /,如下:2 n- k2 G- f6 R$ w# S

, l! x; [, T5 Q! f4 M

[size=1em][size=1em]
  1. 3 \  ]( n$ y# K2 J! e2 X
  2. RewriteEngine on# n! C% Z; D4 p; B4 E, ~' ~# k

  3. 6 J6 g; m; b& G) K9 I/ }
  4. RewiteBase /
    0 n. V6 [( }1 s# X, x

  5. 1 p1 \; M! i" A7 Y& ~  x
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    0 [  T2 B3 q2 X$ b) ^+ A1 b
  7. 7 N' P: s0 K( P9 T
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]$ W+ x' ]1 }/ o, R' V2 l1 C

  9. $ a% n; A8 c- \& T) P- F
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
      `) d( [2 h' ~$ L
复制代码
* ?' P+ a, u- Y# G& y
/ d  L: d2 g/ i( h+ i% S
) S" I7 a2 ^, ^1 g3 a

3 W! }  G, a5 }
8 N7 R/ h: m7 {+ q

, o5 E* z4 g$ _7 u5 O& v* j

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
5 o: d. Y! r" F; ?( m. W8 r* p: [& W
下面附上简单的语法规则和flags:1 R$ z3 v- Y0 n/ `4 m
【RewriteCond语法:】( }; d" M, Q2 \/ e0 H
RewriteCond TestString CondPattern [flags]
6 V; L' L* \( _$ @6 Z+ yrewritecond的其他用法:) T7 @9 F% O7 |3 w# F
‘-d’(目录)
# @( H0 T6 e# V将TestString视为一个路径名并测试它是否为一个存在的目录。
& K4 n6 S# d& s$ g‘-f’(常规文件). f8 E' V: p  t$ S
将TestString视为一个路径名并测试它是否为一个存在的常规文件。" e+ E$ t( T4 q/ p- w
‘-s’(非空的常规文件)8 j7 _; L1 M/ ?/ q
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。* z4 Q7 s$ H% S: S, G% B
‘-l’(符号连接)" e- D3 t7 v- K' S) y. R' I
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
. R/ ~6 ~+ Z/ f1 Q) \2 h' Q‘-x’(可执行)
9 {  \5 [: D; W* D! _9 L将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
/ D. l+ b# l: C* x‘-F’(对子请求存在的文件)% g# Q" S$ O, {: A# c
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
' l% t3 E/ Y$ m) x5 o, j1 H* j‘-U’(对子请求存在的URL)
* V  A! d+ j% @1 e# S; Z3 R检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!, u0 y/ l$ g5 c% t4 D

0 O- x$ k! a7 Q' {' o【RewriteRule语法:】
, w' g* |( G5 \8 j& L; o3 nRewriteRule Pattern Substitution [flags]* @9 n2 h( ?/ ~* u

9 Y. O  z8 {3 Z+ b【flags】:
4 I/ }) z7 k6 W  S3 j+ K! x5 j9 J+ J: s7 {( `& I# \. e' G2 p
‘chain|C’(链接下一规则)
! X0 g8 h) _$ Z3 L. ]7 l此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
! N+ P8 |( E/ L) L: O1 m, j
/ F+ N) j) i/ s7 I, v$ f6 v- d, |‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
/ D9 T$ ^% r5 w, x& f在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。0 d9 {- V2 L* R$ `4 D6 v! S

0 R6 s( k& B  d: T* C% J‘env|E=VAR:VAL’(设置环境变量)
0 U! T; ]3 f8 y4 g此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。/ l$ ~( v: r! f! L" ^

3 r1 q0 U# X8 ]‘forbidden|F’(强制禁止URL)6 n6 X1 E' j) i2 e: ^
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。7 j; P: l1 M) y' b9 [0 i

' q$ u; t3 m8 h9 J‘gone|G’(强制废弃URL)& m1 P4 A% E7 @& n1 v! }2 z+ M0 u% e
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。3 [1 a: Q4 z- t9 F. U
9 g+ _- c+ ]2 H0 ?
‘handler|H=Content-handler’(强制指定内容处理器)
- @  @. D( T# F1 ~9 d0 V强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。* f% K, v0 u8 b% y. }

  Q6 s/ U9 w, ~" b/ K% S; ~‘last|L’(结尾规则)/ h1 H) ]# x6 w7 s% p* @# [
立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。* @& S4 q0 c+ \- ~7 ^3 }" n& [
% K: P0 H* ]- i$ G- j: T# s- T4 }
‘next|N’(从头再来)
/ m# L( S; S- r. S" J1 _$ P& d重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!, ?. X2 ~" O; S/ p$ N. o- n, Q

  C3 @/ C( I/ O6 @9 E8 L- Z) y& P‘nocase|NC’(忽略大小写): ?6 Z+ H: n. n2 O; `- K- z- r
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。8 G$ [2 t7 E6 g" P6 C, r
" H+ G; C9 I0 \: v
‘noescape|NE’(在输出中不对URI进行转义)& I) q0 o8 h& ~, g" T- y2 Z3 P; v# {
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:3 w2 _% n5 @, Q# s( p
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]7 W" G0 {0 {/ i5 A) N% S& f' H
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
" O; k( o* F2 e, G- C& ], r9 t0 n1 U3 E6 b$ L: s0 R6 _' C7 W
‘nosubreq|NS’(不对内部子请求进行处理)
" F! X: \  e* _6 {7 b/ c$ M在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
# u' g' a+ Z: S# O使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
- ~1 D; g) j! [: C. h/ h, ]' u/ [7 B0 {% b2 M: T6 n
‘proxy|P’(强制为代理)
1 t' k) A4 U8 I' [7 `! H此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
( f3 J6 T4 z) S( D8 F9 O8 D注意:要使用这个功能,必须已经启用了mod_proxy模块。6 A% k2 k6 @" Q
  c) n3 o9 t* [5 W% l: e, _. a
‘passthrough|PT’(移交给下一个处理器); v5 l) ?& F. F; O' |# k, _
此标记强制重写引擎将内部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,可以这样:
. p2 \0 B: W& W+ I6 b9 ]1 qRewriteRule ^/abc(.*) /def$1 [PT]. ~) Z9 {& H6 B& E: I( ^
Alias /def /ghi1 `: x* @8 x/ S# U
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
6 l( n- w" J, I' R注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
* [, Y8 K! p1 _! f  I  O4 F" e: f6 @; I
‘qsappend|QSA’(追加查询字符串)
  }/ S3 J9 ~; j; s. R2 Y+ q此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
; \  J! _8 ^. l# f! w1 v2 j; |/ B; p% i- h! E4 A
‘redirect|R [=code]‘(强制重定向)3 \1 V: r. |8 E8 c$ a) c
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
% U! [3 F" E4 h: Y- }# y% M7 ^# [/ n注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
  c" {  O, a/ D& ]. l) g) D) ~5 s! s0 p( W, t( u" S) D6 [( W
’skip|S=num’(跳过后继规则). r% t5 ]: e1 S! U, y* ?
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!' X, }. c) N6 }5 |/ u

4 ^/ s: `: p) s4 K# f% Z‘type|T=MIME-type’(强制MIME类型); Z; I  Z8 ~& Y) [" k
强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:5 m7 T3 `# z. S$ H
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]' M  \; ?0 v$ i3 H: y



0 a; b$ o1 f: z3 s. v

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


' z0 P2 @7 V; s0 r/ o: g5 l1 i

一、防盗链功能
' V- S" g4 V0 D* `

[size=1em][size=1em]
  1. 0 w% n. b% y% i7 ^" O
  2. RewriteEngine On. r9 z2 {3 X. k- d8 x% j

  3. * G# ?' @7 L( f( b* I
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]4 s. i' F+ y& j8 G
  5. - _6 X5 Y! J" Y% m* c; r& N6 o
  6. RewriteCond %{HTTP_REFERER} !^$: `. w/ d0 \, ~; v& u% k# K

  7. / j4 p4 q, e4 F3 H
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]* ~# \! u( T' D! C- G0 W
复制代码
/ U- O+ G4 ~& j
5 M5 r) W! r$ e
0 b) R1 r; w/ f3 y- e

1 ~/ ~6 y: ~6 B
8 ~* P# h! s# W: p( n9 E. R

: R- e. O5 T* }2 D& l* A9 k/ O5 c

逐行讲解一下:

5 V1 a2 E* j! N- q

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

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

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

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


3 G- @1 f4 U$ `" @

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

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


) u: |7 L2 Z9 f7 ]8 I

RewriteCond下:

[NC] 不分字母大小写

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


/ F6 i2 f8 P; c1 I

RewriteRule下:

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

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

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


3 [7 z& ]: T1 I/ y- S/ c

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
% R9 s/ |& x& P1 K1 A4 D. u

二、网址规范化

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

  1. 4 H. _# O* h2 B* @% b
  2. Options +FollowSymLinks
    ' U4 ~# ^) [' s' m

  3. ) X0 I8 q( o+ o" E9 J
  4. rewriteEngine on
    3 \0 g% W3 Q/ J! L

  5. 9 ^) I5 Z0 H% y4 n3 E
  6. rewriteCond %{http_host} ^yourdomain.com [NC]
    6 t' [$ G# i; A7 o
  7. , F# H+ J, \4 Z% B
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
    7 ^% X2 y4 F" F
复制代码

. f4 E0 {' R  T$ k- T9 x4 ~/ X* W
5 w: [5 \' Y* @. H/ r; V) D

% L; ~" f: E4 S, P" s' Y; j3 @; a" `+ p2 f1 G

! L2 b: W4 L5 J) @

& r; s3 N" u% ~1 |0 Q; ^  F, T

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

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

5 T, t/ o- `2 s: q5 R; ~7 I

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

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

  1. 8 g* C' ]& ^) x! l+ D' K
  2. RewriteEngine On# |# u- ~# b# H' R; c
  3. % D$ B# H& u* Q9 M
  4. RewriteBase /* L* r: `$ v7 p3 v) s

  5. - c  o, i/ e1 N6 \( Y
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)  I. X6 ?) z. O# o  y
  7. $ Y, V+ G, C6 ?2 d6 ?
  8. RewriteRule ^ http://abc.com/ [R=301,L]6 @1 i. _& x$ N2 k
复制代码

+ K, c  l* h) b) m% j2 g7 f1 F( p" m+ v" {! ^
9 n! y2 s0 O4 k9 E3 ~$ c7 j
* ]/ h4 g* V: J$ Q

7 v6 h8 _5 p* U: ^9 U
) Z( b5 j& R4 N9 i' B1 O2 i

1.打开Rewrite功能。

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

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

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

0 `- S& {# S* K* \( L

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


9 I/ ?2 f8 o8 Q0 G& c$ |4 T

三、临时错误页面

# b. j% [/ `( n5 z

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

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

[size=1em][size=1em][size=1em]
  1. , S6 Q2 i$ Q* C7 p/ d
  2. RewriteEngine on
    2 i+ t* r9 A5 ^6 H7 _7 L6 I

  3. + N, }2 [' k$ C2 s5 j4 f* d. j
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$2 {' i9 `9 |6 `$ q* o
  5. ' d2 b0 B  B6 h* m3 ?0 U( Q- e
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123, q! `3 m: q- B
  7. 2 j0 ]0 ], g$ U2 I: X( q; P! \+ {- E
  8. RewriteRule $ /error.html [R=302,L]1 T2 |- u# @6 ~3 W2 `! H+ _
复制代码
9 n4 w: j* Q3 W1 D3 M& ?

6 Q4 W1 b7 m& }5 T5 p

% b8 A" v# M$ X- Y8 c6 `: z* ^& O6 @' L' b& B/ K3 F
& a6 s% s1 |4 W; p. x# F9 [

$ X. A3 H1 N) I( T* G; M& h- q

1.继续打开Rewrite功能。

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

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

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


2 A+ H" m! B2 c' d1 [+ j; h3 _" {

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


9 `. n7 a$ ~+ ~4 K

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

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

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

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

9 W% U) D  i: U! y

^ 表示正则的开始

$ 表示正则的结束


9 a% \& l" F- o  D+ S. l+ ?

四、重定向RSS地址到Feedburner

' w9 A( I: i& n6 p

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

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

  1. % s* R$ p6 {. r7 j3 s
  2. RewriteEngine on7 m# |0 u7 _* K
  3. # ]) L4 b$ W: _9 o: }3 Z- @5 F
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]0 `- @0 ^7 |- y+ \& B

  5. & M  n: X# @: S; A8 f9 W
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
    . |& n, d) ?( n2 }( [! I

  7. * p7 d- |. k+ Y' B9 v
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    ) C! _0 H- u: k1 ~) R. |  M
复制代码
8 t$ Q6 i$ |% @1 d$ r
" C# g, I1 i0 a1 n* }
$ v8 e& S& }# t" [4 }# v
4 v  H6 d) F# a' L" }; @
- |6 O! q5 a# c
# A' r/ N* s( m/ A2 Q, ]. q& J, L

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

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

8 b' ?  w! ]6 n5 l+ k, R

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

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

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


9 Q6 h" y" \# L7 M/ W
; y& l7 k4 [* D8 M4 k2 L: U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:57 , Processed in 0.086679 second(s), 19 queries .

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