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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

.htaccess中的apache rewrite写法:
+ n( y7 `: }& i1 k4 G
+ r' ]. l' U$ o& Y9 }& i3 O

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

  1. * k& K2 G( W& m7 z/ k
  2. RewriteEngine On
    7 s* h8 U# `: C

  3. & N1 M9 G) e/ h
  4. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
    0 V8 ~/ @! H5 J. i* I3 O; ]

  5. ! ^5 `5 T. z! u, v
  6. RewriteCond %{REQUEST_URI} !^/blog/
    0 n- V0 B# [$ t: v# n  w& B

  7. 3 Z# j  c/ G4 C6 J; k
  8. RewriteCond %{REQUEST_FILENAME} !-f1 }' K5 R0 m& w  I4 L! H" `, @- j
  9. 7 K) ^* B- z* D
  10. RewriteCond %{REQUEST_FILENAME} !-d
    5 ?. h4 c" w% R- E% U1 u
  11. & q6 ]/ t0 e; |; S& Y
  12. RewriteRule ^(.*)$ /blog/$1( e( V& `5 N7 ^, |1 T
  13. / {3 N8 X# ]1 A
  14. # 没有输入文件名的默认到到首页
    6 \: N6 z3 s2 l. N, w- a, i0 z, m
  15. ( r7 \) g. B4 U* r4 j! p2 ^
  16. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$/ G4 N1 R( g( L6 a- r
  17. 8 ?; L3 y( ?! I! G
  18. RewriteRule ^(/)?$ blog/index.php [L]9 B; G2 R1 Z1 ?, p8 c
复制代码
5 }% f4 G9 [$ k# F9 s7 ?5 N. u* G
  x# h0 w* w$ q& o8 g( ?6 |

! c- A, P& @; w6 ]
. K2 r& i" |" N7 C7 C% x9 ]
  a+ Z9 N! Z; _3 z6 p# S
: G! d0 _9 \5 s# |

下面我开始解说一下上面的意思:
2 _" B% O: q# u, X
, o1 \1 t+ Q6 L$ z" s- Z【RewriteEngine On】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
1 d+ ^  M' K1 r8 Q2 @/ c: K
! n- v  |. e2 }4 P& }1 ~【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】- L2 q% L3 \6 k2 ]% d$ b( o$ {/ O
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“ /”,^表示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行以下的语句,不符合就跳过。
/ o0 A$ B( O+ u3 G4 O4 n
  f, H' r8 T& E0 j1 J! ]" h【RewriteCond %{REQUEST_URI} !^/blog/】
* T& g; E+ P% Q* h8 H; b也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$
3 \$ r. _' a% O2 @, {% }% `
$ _  @+ J$ A  M6 f【RewriteCond %{REQUEST_FILENAME} !-f】  r  I7 z( Z0 @
【RewriteCond %{REQUEST_FILENAME} !-d】. r3 @* V$ Z0 v8 V
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径- u" g1 M) p! G- g8 w8 L( {3 k

/ l5 Q$ i& a" e# q( Q【RewriteRule ^(.*)$ /blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。
% m5 ~- w0 o/ |: |) B
% C; z: }3 X4 Y' a【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】
; U7 ^( U8 @4 g$ j6 r' c* P, r+ g【RewriteRule ^(/)?$ blog/index.php [L]】! h" Q0 p( t$ T  Z
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。
- }4 i8 `. j. }0 O$ R& k5 R$ N+ n' L; i
现在说说出现的问题,RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个 http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。  n) J/ I1 a: K/ y
答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:% i% x9 s, n+ k8 q# Y$ X
RewiteBase /' r, k# {5 j% A$ V# Q  d- r* l5 l

; [4 F5 y8 E9 G9 e$ P* @还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。$ U' j5 c$ W7 z1 f
至此,完整的语句应该是:
/ P% {: k$ U1 ^9 r3 x- p0 _; B2 W2 G' G! L, R5 B' D

[size=1em][size=1em]
  1. , _! r/ a' x6 J' l1 s# O, t2 V: Y
  2. ####start####* I% x9 _0 ^7 v8 i7 U  g

  3. & d6 w" Q/ w5 `& n% W
  4. RewriteEngine On
    / e' n: M% u! s+ l3 ]1 B" l; O. Q1 ]
  5. ! p$ N1 e2 o) Q9 H
  6. RewiteBase /4 Y* m. s* i! b& L) p+ M

  7. ! E* g( N: n  |) H9 u3 q
  8. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
    ( L( I' \4 P1 R1 S2 H2 n* s

  9. . X! D  e# F& y" R: v9 K! z& @
  10. RewriteCond %{REQUEST_URI} !^/blog// b9 e2 |! X3 J! @" Q

  11. $ e7 V* T1 K) u- }+ s5 l5 }1 j
  12. RewriteCond %{REQUEST_FILENAME} !-f
    " p$ y0 b2 n9 l0 w
  13. 0 }8 j8 v# D4 C# j' i7 G
  14. RewriteCond %{REQUEST_FILENAME} !-d0 s) i, y- D2 F( p7 y  n

  15. + w: ?, S2 B2 H2 C& O. b
  16. RewriteRule ^(.*)$ blog/$11 b7 M, p) Z  ?7 ^" ]
  17. ! k1 H/ V  p4 [, f% F
  18. # 没有输入文件名的默认到到首页
    9 M3 d- k) }* |8 R; ^
  19. 7 j0 B* _$ s* q  u/ W8 b
  20. RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]. z2 P1 V* V0 X* I0 Z' z
  21. ( S" |, J4 l& B
  22. RewriteRule ^(/)?$ blog/index.php [L]
    2 o% D+ E9 |0 R! Z& Z5 y
  23. 0 r  @6 w6 i6 r, F% w9 A5 |6 q
  24. ####end####( _. A, u4 }" [& ~% G7 y
复制代码
: L/ L. F3 f# p; F

* E. B& c( v; r, ?

( }( @7 q  M) F! H* @6 y* F. B: h$ {. G2 k

' o& N* L5 o/ p( I& B* d6 _1 s
* ]6 q: w% m$ k& j, Q' a

如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思
2 Z: t3 G) I4 w: I
% C9 C' i( n+ C; o0 I8 v防盗链的语句,同样需要添加RewiteBase /,如下:. u6 i& `: M& }( S

, r9 Y' W* q% w7 i! e

[size=1em][size=1em]
  1. $ m" e" D2 e0 ]5 ^8 E! @5 a
  2. RewriteEngine on
    : c& k, b6 g) Q

  3. $ g- e6 ]% ]/ f! a+ |
  4. RewiteBase /
    6 i# f5 D" o$ G/ i
  5. 6 J, L, o' y& @+ K' M* _. @7 @
  6. RewriteCond %{HTTP_REFERER} !^$ [NC]
    ; j$ \: |& `* N( [4 e4 o+ t
  7. 6 A( @' ?( z2 E( x8 U0 U
  8. RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    6 u/ p4 L5 @1 ]4 U' `$ s8 \  J. N# F9 J: a
  9. - Z4 p( u! D% o. a$ l
  10. RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]! B3 M: C# u& ]5 @- L
复制代码

, y* Q0 A2 d& j8 z1 b- S- @- C' Y' p- \: U
7 e$ j0 i1 X  C$ t/ _
3 w& c# u6 f$ \( s6 b+ y
! f2 p$ w; {+ T4 Z$ h* p/ q' O. c

4 _+ h6 I, y; r/ c3 |

如果后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。
, X# P' l3 j% ]2 C7 O. b* P; z; Q& K4 z6 s
下面附上简单的语法规则和flags:
+ @  A! W7 M% D- K& D4 t【RewriteCond语法:】1 I1 _, y3 B5 I4 A. I; r- @& y4 ~* H
RewriteCond TestString CondPattern [flags]
8 W4 J* m# u1 L, Orewritecond的其他用法:% G( n$ h+ }: V  g
‘-d’(目录)
0 U3 J% T1 z) E; \3 z- T% G% I. |# a将TestString视为一个路径名并测试它是否为一个存在的目录。
  t* T5 ^# ?5 E: R! q‘-f’(常规文件)
- {- s1 q+ U  t* r5 X将TestString视为一个路径名并测试它是否为一个存在的常规文件。7 |  F7 A9 {2 `. K
‘-s’(非空的常规文件)
: Z0 Z4 k' ~/ n/ g' r将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。, |2 e$ S/ ]; z5 r0 [, N
‘-l’(符号连接)
2 S, m& E, {- t5 U7 j1 K; H' {将TestString视为一个路径名并测试它是否为一个存在的符号连接。
  c. N8 ]; T# w' \. k4 P7 \‘-x’(可执行)6 `8 h$ {! b9 f7 u1 z3 v# B6 r# j! B8 D
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。2 V6 F1 h) x- K8 _
‘-F’(对子请求存在的文件)
0 d& ]$ o4 g: N+ V, X0 I, |检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!2 B5 N5 l4 e+ R) P
‘-U’(对子请求存在的URL)' G- |* o; b; t; y1 c: d" W
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
2 S9 S2 r! `0 o  r5 ?) ]: H- ]/ y
【RewriteRule语法:】6 G+ \8 V3 @4 Y3 ^& k
RewriteRule Pattern Substitution [flags]
* S- ~+ P" A; c; x8 k  D4 K- F8 r: A
. N+ L. f$ R- B" [- L( U【flags】:
& f( d4 [0 q0 s$ x4 ~. D( Z2 Y7 X0 G3 q* }% g" u8 u
‘chain|C’(链接下一规则)6 a; v! x; s. k
此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹 配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。
; U" V0 ]! r4 z- _$ B
5 \5 {/ P4 v' r& _! d, L  t4 b# Z‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’(设置cookie)
! \. T; ]/ [2 [: {0 U; a4 e* w在客户端设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比如’.apache.org’,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
2 a' e, r; \: O1 M; M
) h5 S+ `8 s$ b+ N* `‘env|E=VAR:VAL’(设置环境变量)# x7 h+ h& w( m! I) [/ z0 d
此标记将环境变量VAR的值为VAL,VAL可以包含可扩展的正则表达式反向引用($N和%N)。此标记可以多次使用以设置多个变量。这些变量可 以在其后许多情况下被间接引用,通常是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{‘VAR’})中,也可以在后继的RewriteCond指令的CondPattern参数中通过% {ENV:VAR}引用。使用它可以记住从URL中剥离的信息。
  V3 A$ `9 `- }6 V9 L* i3 n- m% W
  j0 s% s& ~2 e5 x‘forbidden|F’(强制禁止URL)% E* S- v- A0 a" Z# ^
强制禁止当前URL,也就是立即反馈一个HTTP响应码403(被禁止的)。使用这个标记,可以链接若干个RewriteConds来有条件地阻塞某些URL。
4 G6 t' Z' U/ R3 }# n% Z. O, s( H+ G0 c' a/ V( j$ X6 q
‘gone|G’(强制废弃URL)9 q0 {  \' r# `
强制当前URL为已废弃,也就是立即反馈一个HTTP响应码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了。
' u  f6 `, Y+ m1 t$ H; N
4 [, ]1 [2 P3 f‘handler|H=Content-handler’(强制指定内容处理器)4 A; b1 Z: {& _+ ~. O+ T& z( v% @
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的所有文件都由”cgi-script”处理器处理。
  E# g. h+ z/ N6 o
& f; X) U1 f6 p. _‘last|L’(结尾规则)
! k% ], w8 O* N立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它可以重写根路径的URL(‘/’)为实际存在的URL(比如:’/e/www/’)。
* K2 n( ^& y1 ^7 \; ~  H( H6 |$ V; {9 F/ P# h2 r
‘next|N’(从头再来)
6 h$ [( Y8 K: U; z- Q重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于 Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环!" Z7 ?6 d. a1 v/ t+ S! A, S# r7 E

4 A# X4 h6 M) s0 x2 g, ^‘nocase|NC’(忽略大小写)
) n8 f0 t+ c+ k2 n* w$ r  L它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,’A-Z’和’a-z’没有区别。) W' h; r3 y1 g, `

2 O6 ]6 _$ _0 `# u‘noescape|NE’(在输出中不对URI进行转义)
$ _/ N2 R& o& b4 R7 d5 n此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(‘%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码(‘%25′, ‘%24′, ‘%3B’等)。此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,比如:5 z! J  N3 |! {0 C
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]0 [8 c& r, P9 l8 z3 E
可以使’/foo/zed转向到一个安全的请求’/bar?arg=P1=zed’。) k) W! `) o; w' \( C

4 K7 i( @0 i. O‘nosubreq|NS’(不对内部子请求进行处理)
2 F' a5 y+ t7 V+ w在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索目录默认文件(index.xxx) 时,Apache会在内部产生子请求。对于子请求,重写规则不一定有用,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除 某些规则。
: n. {% K. Y2 s$ K使用原则:如果你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种情况下,可以使用这个标记。
! Y! G8 h+ l7 l" z# p4 `' ]9 A
4 a2 d: e0 C" P9 \4 H: v‘proxy|P’(强制为代理)8 A5 ?6 r7 g8 w7 ~
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被 mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成 分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。' Q" Y% l1 O8 a& V' p
注意:要使用这个功能,必须已经启用了mod_proxy模块。
, y' }7 A6 O: Z! c) c5 u/ A
: N% k+ T0 f. d9 ^+ f% S( o‘passthrough|PT’(移交给下一个处理器)
+ @% Q7 O8 s$ ^& }此标记强制重写引擎将内部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,可以这样:
5 O8 ~# a* Z- K6 a; f9 IRewriteRule ^/abc(.*) /def$1 [PT]6 D, L! I9 l4 n
Alias /def /ghi5 {+ a) f: I/ e& M; {
如果省略了PT标记,虽然将uri=/abc/…重写为filename=/def/…的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。6 X$ V5 `' ^% ~1 X2 B
注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。
  L2 {( G# n3 z! G8 r
9 L6 W  @" i/ {‘qsappend|QSA’(追加查询字符串)* G! A; Q  N- _, R8 M. _
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。4 ]' \% {. a" Y* J8 @

" C" N5 G0 u: t' D! `) v( h& @‘redirect|R [=code]‘(强制重定向)' \  k) |) E% p+ H
若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个 外部重定向。如果没有指定code,则产生一个HTTP响应码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定即 可(或使用下列符号名称之一:temp(默认), permanent, seeother)。使用它可以把规范化的URL反馈给客户端,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。
1 x$ a# h$ y' G, X: Y注意:在使用这个标记时,必须确保该替换字段是一个有效的URL。否则,它会指向一个无效的位置!并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/前缀,重写操作仍然会继续进行。通常,你还会希望停止重写操作而立即重定向,那么就还需要使 用’L'标记。( U* y* `* A; l3 }  q5 g+ k* x
+ |7 Y' x  M8 R9 P3 j
’skip|S=num’(跳过后继规则)  c0 h6 y/ ]: T2 Y) S
此标记强制重写引擎跳过当前匹配规则之后的num个规则。它可以模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和’chain|C’标记是不同的!/ V8 k% S' ^  @( U% p$ _" E7 ?

1 }& {! N- j. r3 i( a‘type|T=MIME-type’(强制MIME类型)
2 O- W) w7 o8 e: w9 i; I强制目标文件的MIME类型为MIME-type,可以用来基于某些特定条件强制设置内容类型。比如,下面的指令可以让.php文件在 以.phps扩展名调用的情况下由mod_php按照PHP源代码的MIME类型(application/x-httpd-php-source)显 示:
# i  b! W7 F+ D( wRewriteRule ^(.+\.php)s$ $1  [T=application/x-httpd-php-source]& I* v$ L4 h; E, p) D+ N7 |



+ i: x9 k9 ^! z2 Y5 J

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


: J/ @* S! L7 }/ f; n# H

一、防盗链功能: j/ N" ^" [- a9 [) N( [- y( p1 s

[size=1em][size=1em]
  1. 4 i6 z/ d: P* `& v0 B
  2. RewriteEngine On
    : w/ ]- }+ y% f! @' R

  3. 5 T( N5 Z' C6 g
  4. RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
    - c  D4 v$ e; G2 A/ ]. u
  5. - N9 k! q. n+ d- X' k+ e- p
  6. RewriteCond %{HTTP_REFERER} !^$
    6 d& Z$ `% `* o& K

  7. 8 T( f$ y$ R4 j
  8. RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
    ) d, U. E4 ?; Z
复制代码

1 X0 I8 [; ?' ?" M$ v
4 V8 e- q3 _7 e8 _
# ^, @3 G' a) h" b
  @5 m9 y$ D1 v+ E

+ M3 u  P% O8 E# N7 `# S
! F1 A0 n7 p+ v8 s3 w9 W

逐行讲解一下:


( y* e' C8 N0 B- v

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

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

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

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

1 B9 |: Q* {0 b' |. w, S3 H

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

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


: U) N- y" R. L. i! b; X9 _( \

RewriteCond下:

[NC] 不分字母大小写

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

; f. K1 x9 w( q; y' y

RewriteRule下:

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

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

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

+ I9 ]* \0 m: ~! o* z- f& O

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

http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
, C8 ~4 M' k! B  i; Q! o! D

二、网址规范化

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

  1. . k5 i: ]$ ]+ E- N, u
  2. Options +FollowSymLinks
    + K# F2 y5 V+ F3 i; M3 |% i
  3.   k! u* x2 }& {4 R4 @& r' E
  4. rewriteEngine on
      l# w& V: Z- P1 R# y& @( \1 [. X$ X% {
  5. 8 ~6 Y: E% `) r5 j2 g
  6. rewriteCond %{http_host} ^yourdomain.com [NC]; f+ m. C4 V" L3 Q

  7. 5 y& \( V- s7 l2 G5 O
  8. rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]3 W- W) G$ Z, X0 D# H6 G, y
复制代码

$ j+ P, V5 P/ U" s$ s; l! B9 Y, u; Y

7 }; N, Y! f% p
3 V+ O. z& a( |* X3 ]* e
+ l) G" E: E' Q+ g

3 Z; p& ~( z0 t  E4 b

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

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


0 ]3 {% V/ g6 J( F, f

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

[size=1em][size=1em][size=1em]
  1. " l( q8 Y; x. w+ m0 v2 X
  2. RewriteEngine On+ {- G. U! Q0 m' U. n2 V
  3. - \( R& a2 ^0 q- M- x% y
  4. RewriteBase /
    # ]  b7 q0 c: }* ~

  5. ! W1 K; S; y- |9 k. E
  6. RewriteCond %{HTTP_USER_AGENT} (Googlebot)
    ( [0 X% b& @; Z
  7. # E7 |9 P" g. X) v3 @
  8. RewriteRule ^ http://abc.com/ [R=301,L]2 Q  @& e- M6 Z8 u
复制代码

1 i/ u5 J* [6 ]' z; m# O" b; q# D, N) R0 M( B" ^
5 M. i/ {8 D% `$ u' Q4 }) t- O

; G* k: z4 ^% O) }) @8 V4 u/ L+ ]8 X5 y1 l- a

( e. k8 I0 m* n. C$ j) f7 ?0 }( q

1.打开Rewrite功能。

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

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

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


3 p2 _& X4 @/ J

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

. x+ Y1 t, p) x

三、临时错误页面


8 E1 l+ f2 a: Z+ @) f) F; v. f

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

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

[size=1em][size=1em][size=1em]
  1. + X/ N' }7 U3 e* u  r
  2. RewriteEngine on2 s5 k; h! m' \$ E
  3. 7 {) `7 s* J5 ^4 r
  4. RewriteCond %{REQUEST_URI} !/maintenance.html$
    . T2 K4 }  U' a3 Q" @
  5. 2 R* m+ c) o8 s+ x
  6. RewriteCond %{REMOTE_ADDR} !^123.123.123.123: O  a* w# r1 M3 ]
  7. ) Q: U2 o0 M4 T1 U7 C; f) T
  8. RewriteRule $ /error.html [R=302,L]: Y& V3 F% N" g2 L
复制代码

7 Q# i2 m! u" K4 ~# [. b7 H' N' q! F/ c1 [7 q1 \/ y" j
! Q! \  v6 Y, Y. }; F: N/ [
6 R) a- t2 S4 R6 y: S3 y* v' h1 d0 B
" r) [% e# M' \4 a' R

" e' m. u" H' O; b1 E

1.继续打开Rewrite功能。

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

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

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


; v$ l* U1 K$ `! N# J' ~6 b* ?1 ]

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


& K) H4 a/ {" j  T* j* a

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

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

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

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


! z! I, d6 `+ V/ Z

^ 表示正则的开始

$ 表示正则的结束


- I% W4 E  `1 ^1 d, c

四、重定向RSS地址到Feedburner

3 `6 A9 A$ [8 Z/ [0 D

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

[size=1em][size=1em][size=1em]
  1. . k% V5 ]; g. Z& _" r
  2. RewriteEngine on+ K( U3 e5 l1 {

  3. ( a/ j4 ~8 `2 g5 Q
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
    0 ?; g/ U) W( M

  5. 7 c/ C" u' d% F7 z& Y
  6. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]  T# {- E# ^  V/ J# U" b+ Y+ U; g

  7. . @& X3 X, K; i% Q+ e5 [) O
  8. RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/yourname [R=302,NC,L]. H# `. i3 O# Q  E9 h( I" ?
复制代码
& Q5 h2 W& P, W

  f( K: N5 s- a) c; T3 @0 b
" [, H  @& A9 b" @1 ]( M
7 l# Q# F) e# a
0 m6 v/ j- j$ Z2 M
1 r. k1 k' q8 a9 F

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

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


$ Y5 p, u2 r, V4 n5 m2 p, Y

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

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

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


& l; s. Z' N9 z$ }% r  x) ~, ^& W( _' R& c* ?  U& O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:57 , Processed in 0.116216 second(s), 20 queries .

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