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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:- M$ ?, y; f7 l- i2 }; L
$ Y' X8 T) ]  s& B5 J# z

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

  1. 2 F/ B7 t6 z, C& ?! [
  2. RewriteEngine On, ~4 e9 t$ B5 H" o: q

  3. ( V. p/ D* }* D8 m0 k( o
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$# V7 S1 F6 Z+ e4 q2 H
  5. + I4 [. o+ ?0 v0 E6 i! S7 z
  6. RewriteCond %{REQUEST_URI} !^/blog/3 Y$ ?# T7 F) j8 H4 g1 B2 n- U
  7. ! L& R0 H+ b* l9 {3 u# ^1 M
  8. RewriteCond %{REQUEST_FILENAME} !-f
    % U2 n. z& m( I/ u
  9.   A$ O7 ~; Z' v0 ~* V$ E
  10. RewriteCond %{REQUEST_FILENAME} !-d
    . Z+ H' f; W+ g% o& @1 [+ ]
  11. , K" J: Q  Q+ F* j& y& F
  12. RewriteRule ^(.*)$ /blog/$1: K- w; \* ^" D0 B7 q
  13. ; [4 z; Y. I2 T0 \1 t
  14. # 没有输入文件名的默认到到首页2 [9 Z6 X' a" S% v# K

  15. ! n+ G0 n$ m9 q
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    1 L' d9 y7 `& c/ ]+ z' i
  17. & i9 p7 ]: `5 w( t- X
  18. RewriteRule ^(/)?$ blog/index.php [L]  q3 b: m1 W- f1 O. S0 V* g2 r
复制代码
. r" u- D* `& I. T$ Y
7 T. N. |3 J# k# K2 W! x* O+ C; z! T
( c6 j' j5 H# f3 I

+ X+ S' G3 B4 I* H. j' K

1 H) R0 I+ h/ k2 D/ z6 U- |

  N( m$ f1 g, z3 |% I* X, _" X

下面我开始解说一下上面的意思:) V+ ]! q' S. s- d/ k
; @( r) }9 |" O+ t/ [9 V0 `1 p( r
【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。$ Z% w3 ]; V* W" T
( [8 A1 a5 n& P7 h' G8 N
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
) Q3 r$ P: R% G3 ?9 x" D这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
. v2 ]1 l$ z1 t. [" q) \- ?. W6 d. |
【RewriteCond %{REQUEST_URI} !^/blog/】
4 i0 f( V' D5 P. E) H- h9 q9 T也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
8 @' u7 q5 w: V6 }5 p, e; ]/ i% @7 _: c1 n# a0 \( t
【RewriteCond %{REQUEST_FILENAME} !-f】
# _% C$ o$ e6 s6 K【RewriteCond %{REQUEST_FILENAME} !-d】! P2 l( w& \: u7 i
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
. Y" a4 F  a( k8 D: C
* s$ O  C1 {2 D【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。. w) i/ H9 P, `; g
) g: Y* \& {2 C" l0 r$ ?
【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】7 A1 I- I! s  ^+ d. W( \
【RewriteRule ^(/)?$ blog/index.php [L]】
, M, c/ k, S8 p这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。/ H1 n8 Q  p$ P5 V% d' \" o( `7 k* s: i

' A, T5 ^# K* w2 x( u( ^" g现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。6 A1 q# \2 m/ t/ I$ `, @9 J
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:
8 i6 Y: g; Y  e( YRewiteBase /
% Q5 i1 Y& c; B) H, {
" U, o! v2 f# F/ f还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。1 G' b2 A9 O. K# L" X
至此,完整的语句应该是:4 t1 e" O+ c# U$ \. |

7 g' L% d. R  \1 \' P) r! X$ [. f

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

  1. & S. ^6 N& ^, C2 I5 _( ]
  2. ####start####
    # O/ e$ S5 B5 y% Y

  3. 2 F4 d- K) b4 g5 ]8 d5 [2 L6 j0 T! m
  4. RewriteEngine On9 Y. [9 W9 e( v
  5. ' O) U! p' l8 C4 X
  6. RewiteBase /% o- Y# d6 i' l: Z3 z( V. r

  7. # f) G1 Y1 S5 l; l
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]+ h9 |7 K6 B& O6 D$ J

  9. . {. R- F, ~+ {9 l
  10. RewriteCond %{REQUEST_URI} !^/blog/+ _3 |" n7 h" E6 ^7 G6 c& ]: f

  11. # p3 _$ A6 }) F
  12. RewriteCond %{REQUEST_FILENAME} !-f
    ; J  ~" [5 |9 e& `' \

  13. 6 G/ D% \0 \0 E# d! s  D4 \
  14. RewriteCond %{REQUEST_FILENAME} !-d) U( x. C0 V6 x6 w

  15. ; q2 ]* B" j) ~
  16. RewriteRule ^(.*)$ blog/$1) K& T( M6 P, q

  17. 9 A4 Z. G5 I% l; A8 q/ V
  18. # 没有输入文件名的默认到到首页; `0 v& l7 W6 x- C# `  D7 F! J) p

  19. 5 O3 H3 x) K5 x2 z  v4 l
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]+ z, J2 \3 {# ^2 U, P2 y# x# \  T

  21. 7 x1 d, b6 ?/ d1 f6 R0 r) H1 g' J
  22. RewriteRule ^(/)?$ blog/index.php [L]& ^9 y5 X9 y( f2 I3 }

  23. / P/ }2 g, i& W$ I8 D2 @
  24. ####end####
    % G  }$ k- d" v0 C4 O) C
复制代码

, q! |$ P, ^% P! `( X/ f! j$ b- s* q/ {! \$ P) W' a

4 R/ F& L' S7 |6 @! [8 U' o
5 f7 |3 z) E3 }  y* G  P
% A0 e) B* Z4 o3 A

0 {8 k, p& h' B  y: z9 r9 J

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思4 H( I: Y; F9 Z  s' V5 _
1 K8 X- @! r8 B+ g
防盗链的语句,同样需要添加RewiteBase /,如下:3 Y' A+ R3 ~' T
8 o4 G5 D/ E- M

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

  1. . r: @$ V) g' {! N
  2. RewriteEngine on* m# N& c. M2 ]- ^! C' T- t- A

  3. : r& _2 b6 [: h$ H8 T( s2 `
  4. RewiteBase /
    ' p' M2 f9 k/ D- o2 h+ `" ~
  5. . x, O& Y2 |8 T8 Q
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    ( ~2 l- E; T( Q
  7. 5 t) r8 s2 ~% r1 T  S6 I3 ~1 D( L
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    3 j7 r" y* ^+ E1 ]
  9. ! O$ A8 S% l, V6 ]0 s! b( `
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]* T" l" u- f  [; L& s$ X6 j- R. n
复制代码

) i- }2 Z6 K$ F6 F. x" y& s
+ q) w- R5 _4 {

+ l& g9 a& j. B+ ^8 R  F, s9 n; u
" \4 b2 F0 ]- Z) e* J
/ o3 ^- w7 b- x' I7 S% ^3 [4 L3 A, c- G6 E
& ~0 Z. m( i, i7 H

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。) R1 e- T& x9 M4 i. c
3 h( z# }  M9 `& F
下面附上简单的语法规则和flags:
% n# k# b, h6 o( ^% j& j【RewriteCond语法:】0 E" U& ]" S% `" ~: ^- J# b' D
RewriteCond TestString CondPattern [flags]
9 t4 \4 N; ~$ y/ |$ f4 ]! Z. H4 D: arewritecond的其他用法:
5 I/ P, b! k( \: \  `‘-d’(目录)
, s5 X4 A1 Q3 i1 d1 V# ?将TestString视为一个路径名并测试它是否为一个存在的目录。
) i% v% ~3 d( e% ~- o0 [2 r‘-f’(常规文件)
: E; u( v' A( |. S4 R0 b将TestString视为一个路径名并测试它是否为一个存在的常规文件。0 p  P, [/ q7 d* c4 ]) I
‘-s’(非空的常规文件): ^+ G) s9 y1 ]; p7 J5 i& M
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。9 w3 C' c0 C2 W; A  ?7 [$ X. y
‘-l’(符号连接)
/ R( I2 G" a! _将TestString视为一个路径名并测试它是否为一个存在的符号连接。
( p5 f: v+ i. P& a  E  {7 |) [‘-x’(可执行)
/ ?7 `/ \) L6 p4 f; Z/ y将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。/ {5 _" T( n+ v( Y- R$ @' G  p
‘-F’(对子请求存在的文件)
/ R/ y% l  V# r8 @* K6 s5 E; E检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
. _( X* T5 E; W" D2 ~‘-U’(对子请求存在的URL)8 i6 {0 s+ e% _8 @% s
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!2 {) |0 l: _6 ?/ M0 z

$ ], ?7 j; t* {8 J【RewriteRule语法:】( W$ \3 z5 n1 U1 A
RewriteRule Pattern Substitution [flags]. e. w) L1 U3 b: s
: @" ^0 U6 u2 y$ T
【flags】:
7 F" z! Q4 W" z/ M5 u$ m( f/ e
/ l& c0 J" p' v1 B+ h‘chain|C’(链接下一规则)
2 O) y0 \; R. ~7 r- y# C此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。" \8 _3 \# L% ^# p7 s) F- J

: E  _7 u  T8 ^( n& d‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)! f' G" Y$ q' v, W
在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。+ [& H* h! y7 k/ a/ ]& C2 c
: Z6 J7 |! a7 r( ]
‘env|E=VAR:VAL’(设置环境变量)  x: p6 ~" l: g0 }
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
. |4 M/ h  `! k) A6 y# T
# `1 G9 _: q$ v( @; j% z% z  S8 e, y‘forbidden|F’(强制禁止URL)3 i$ Y8 h* `. B. g
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。9 z- B! @, D* @0 H, h3 L% c

; U4 u: {) Q: p; f2 u% ]‘gone|G’(强制废弃URL)4 _1 @0 x3 U4 P- M3 l
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。1 _" o  y6 d7 O5 I, i% d9 ~/ q* c

- d4 r" x- u2 S1 S6 g$ i‘handler|H=Content-handler’(强制指定内容处理器)$ I0 w+ U* o8 ^3 X  [$ z
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
* `6 j6 C1 }* Q8 e. q0 P
  I6 u. o8 n# A, R7 l' f‘last|L’(结尾规则)
! v% t7 I6 o* Z& y  w- k( z立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
4 R( Z6 i8 q! ]& _$ I4 \9 P) C& I8 o/ [" M  [8 [
‘next|N’(从头再来)
5 S4 i7 o/ b" q' n" m% Z8 j; a重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!
+ e1 U5 z5 }; d5 E! _6 `2 t( V. t3 m
‘nocase|NC’(忽略大小写)5 S; U- \5 W# @# Y8 K5 ^; \5 t
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。# O. I# z) ~3 ~  x1 m
* t; R/ P: S8 R& s
‘noescape|NE’(在输出中不对URI进行转义)3 J6 r+ t, V( M1 [) F
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:- Y7 O, j  s1 Z7 J! ]$ c. v
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
8 b; W" j9 |  ~# Z9 ?可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。
2 C+ ?# i/ d8 l; f
6 U) K  m& b' ?# u, S' Y9 f* r‘nosubreq|NS’(不对内部子请求进行处理)
4 t4 D: J, ^" i7 F4 `在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
2 z' Z5 f5 f. a" E  G2 W: g使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
  R+ v1 }: b+ p
: h- _* M, y. ^/ T9 D‘proxy|P’(强制为代理)1 _2 U% a1 a' O1 {
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
" g# o9 v) [3 G+ b1 \& {+ T注意:要使用这个功能,必须已经启用了mod_proxy模块。
+ Q6 d" D9 x7 u- l4 L$ U3 |/ j4 D" v1 X0 G+ K, ]0 |
‘passthrough|PT’(移交给下一个处理器)/ E6 Q3 f5 A# }9 f
此标记强制重写引擎将内部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,可以这样:% M7 L8 P1 r4 g6 }; e* \: `# J
RewriteRule ^/abc(.*) /def$1 [PT]
$ t, ~6 j( P4 D/ A% a  Y: d. tAlias /def /ghi: `* k7 q( Q5 O1 x- \7 `% s. ~
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。
$ A/ W: _# Q* t注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。% G: r( k  ~& M; ^
6 W' |2 |+ Q2 l  W4 C
‘qsappend|QSA’(追加查询字符串)# H% b  ~. K" Z
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。$ p8 Z& A9 u9 x, K6 P. |9 p; U: {

# I* g3 l; W6 X7 {7 j! w‘redirect|R [=code]‘(强制重定向)
& @) N! C  ]/ m若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。7 c+ @9 Q4 m; X  e
注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。
- A! ?6 k6 }* L& P" m: l
* _8 y9 A" |5 l+ N3 l: u’skip|S=num’(跳过后继规则)- P! o" y  m( j6 E4 q: V
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!
- G$ {! A7 o8 f+ ?8 `* Q
& u) x* F1 x' I6 ]+ E- s* x# H, |5 V‘type|T=MIME-type’(强制MIME类型)
( U2 [% W" x2 L强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:5 x1 C4 |& I, z# l+ S
RewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]% x1 d$ e) ]8 s& g' b4 S# y5 C


4 x+ c  b+ m' g5 ^" x5 x

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


, A4 m3 |* t0 z1 e. o' t

一、防盗链功能
( [3 y# h3 Q) {3 J& q1 t/ s- F

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

  1. 9 z, r3 P& I9 E' E! `
  2. RewriteEngine On/ J0 ]$ @* r* t

  3. 1 `6 t9 l0 }8 h& o$ Z( L
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]+ h9 l2 [: w# |: j

  5. ! \# S* m+ ]; E) M5 E
  6. RewriteCond %{HTTP_REFERER} !^$
    - z5 q& X1 N1 H. r: B- `( a

  7. + w/ ^4 d# P4 n$ ^- {5 l
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    , S" y4 K1 Y. ~
复制代码

% g. t- H. N0 T
, S6 }7 H4 ]* P1 t8 z! F% V# l
  V  Z+ p* x' B6 m5 l
  K1 j+ x9 m. A) V# ?9 }

7 m) [/ L% n0 A, ?5 q  f" W# A

  U5 J1 _8 ?- }! B* _! E  L

逐行讲解一下:

3 d# @9 @7 T% l  [7 N1 s

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

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

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

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


! [7 T' g( K: y

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

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

, n. ?  A/ p6 y! v$ @4 B: @( k% _

RewriteCond下:

[NC] 不分字母大小写

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

5 Z. j; r" w, z

RewriteRule下:

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

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

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


. B" J8 T- E' o' B( F4 V

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm7 r" p& g4 m" w

二、网址规范化

[size=1em][size=1em][size=1em]
  1. ; v5 S# k: }( R  [7 F2 M2 H* v
  2. Options +FollowSymLinks
    8 `% e% o: J2 V+ W
  3. 0 g4 I; f: `( m1 G2 \
  4. rewriteEngine on6 c# d2 h( H9 i  ~, ~3 ?: ]% Y

  5. 8 L7 c0 ?/ }% E* e; E; f8 p
  6. rewriteCond %{http_host} ^yourdomain.com [NC]- ?) f; |3 T: F, z+ t1 X  Q4 V/ ~( q5 H

  7. 3 M0 p' _& `# ^
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]3 G. M0 t; r1 X
复制代码

" K/ j% |4 j1 {6 F6 a% b9 A. J3 O8 t- i, m3 u# ?+ J/ F

; Z5 w/ i1 \. C6 i# C. B; h
" z1 v7 r# {4 p/ w+ y! J- J

0 B. K9 o% I( D
5 ~; S- W4 m9 L3 x

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

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


5 U2 z7 o0 T) m9 V

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

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

  1. / m2 Q4 t% q$ e* c8 d$ C: G; M" ]
  2. RewriteEngine On% T, J) }8 p' n) I0 A2 A
  3. ( }; g( _$ s8 [& b! ^# ?
  4. RewriteBase /
    ! K$ r/ y9 ]' {  ]
  5. * r$ b# m4 [3 q) a' u) o
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)% |4 x# A* g$ `: m3 o) y7 I" Q5 d

  7. " h" [7 p, U/ S- J5 x5 P
  8. RewriteRule ^ http://abc.com/ [R=301,L]
    / I  v4 a6 |5 p! k2 w4 C0 S
复制代码
1 ]7 w/ C" g" @! e+ C9 B4 D
* T4 p! l8 ~" j8 I; c2 L5 T

  F& V0 J2 V, L& M
9 [7 z  k& }1 L* O/ J4 @3 g) M. y6 d1 t9 M

/ y+ \( u6 @& ]8 X2 v- s3 C

1.打开Rewrite功能。

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

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

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

. S* q- G- @2 @

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

1 e: S3 f& n" f5 f9 X9 u

三、临时错误页面

- o1 k  P* Z  M4 h

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

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

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

  1.   P/ ]- D$ i. E0 j7 ]
  2. RewriteEngine on
    2 g3 }& @6 s1 o; ^2 [  w
  3. 2 {# D/ ^* T) w+ w7 F
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$" A9 S- s& ?: v

  5. . c, s3 |/ S! l. ?: i
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123# Y6 T4 S2 r$ N. |, P8 A
  7.   S. `- {" \. n; W% B8 a
  8. RewriteRule $ /error.html [R=302,L]
    + k& G- a9 G/ [
复制代码
% l- X2 i# z4 X- D% Z2 p0 F/ F6 v

( D8 \4 S) j4 o& T: ]

9 R8 {) e2 l9 S
+ V2 {$ i* L# A6 y5 Y2 c" s5 g; l, [

, w! k' n% f2 S9 A+ M

1.继续打开Rewrite功能。

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

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

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


  S1 c" q9 h  H5 O$ C* h- }3 P9 `

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

5 v/ L# v4 o+ W8 [$ K: v

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

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

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

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


# F: A% U: l; G5 d5 q) `9 k) R$ }

^ 表示正则的开始

$ 表示正则的结束


% C: j  d+ Z+ A+ H

四、重定向RSS地址到Feedburner


, Z$ S* }: L1 j. @8 h2 o

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

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

  1. , N3 c! M; C. T& o2 O
  2. RewriteEngine on6 G3 _  g4 \- M6 t, o  Q9 ?/ b
  3. + t- r0 U/ b" [" W1 [
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]8 J; o# `' y/ p4 T; Y

  5. . K0 p6 X( |% T) _: O; a% q  g
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]' E% w% N" k3 T4 S
  7. 8 k3 w* C( I% N, e
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]
    & f# m# r$ o! N1 t
复制代码
: T5 J* }# d- Y& {
- e3 U4 F1 E9 t

2 N8 E) n6 w% C7 ~( r
# z- v! J/ l0 C5 {
: ?& V0 @; L; m$ ?% K
2 c6 R3 H+ P  \/ ^8 \, F7 \! U

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

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


4 I0 `1 B  c; o- E

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

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

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

& f/ u4 p' ]% t: F3 Q. V0 ]

0 U  r7 }- o6 s" n# b) G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 12:40 , Processed in 0.055840 second(s), 20 queries .

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