.htaccess可以做大量范围的事情,包括:文件夹密码保护、用户自动重新指向、自定义错误页面、变更你的文件扩展名、屏蔽特定的用户IP地址、只允许特定的IP地址、停止目录表以及使用其他文件作为index文件,等等......
# Z% x6 S9 n2 a0 h7 a
, ?( H3 c H* i( _" k1. Introduction 介绍
. N/ V$ t- Y; j f8 F( p. a$ N! h- T
文件名 .htaccess 属性 644 (RW-R–R–)
3 T/ z0 j& t% p: h; L! K
htaccess会影响它所在目录下的所有子目录
S* t3 u. V. a/ U/ x3 g$ t注意大多数内容都要求保持在一行之内,不要换行,否则会引起错误
' v7 {% O% O" Y8 x* @
) y5 N1 a! Y& v3 a7 u
2. Error Documents 错误文档
9 I# P( N6 E6 {4 W IOfficial document: ErrorDocument Directive
( y2 z( V, v! |) ?1 g7 E7 @ErrorDocument code document
" y% m, A" F6 @! i7 ]) u& I! h例子
3 K* R& I' T" ?- `& f8 j/ z" Z! AErrorDocument 400 /errors/badrequest.html
. I! Z- \. t% V. h8 t5 z9 \& }ErrorDocument 404
http://yoursite/errors/not... ) d3 |8 u3 r- @: a9 k6 S
ErrorDocument 401 “Authorization Required”
/ J% A' O/ W1 J- u8 V6 J& a5 d(注意之后内容如果出现的双引号需要转义为 ”)
; x# ]2 k) N' ] @7 N- V7 T常见HTTP状态码
9 d, J) S+ c# d, e* H# {Successful Client Requests
+ c$ p V4 `+ ]
200 OK
7 C/ L$ G5 U& g; H% N! N201 Created
+ E* X1 g% C0 b, G
202 Accepted
; `# ~6 @% Q: R; M8 G& e1 B- T( Q203 Non-Authorative Information
+ b# K1 J: J; R$ N
204 No Content
2 B- D) q" u8 y) E* p4 X* h& m5 h' w. U205 Reset Content
/ o4 ^3 \7 U3 @- |1 _/ _7 l! D
206 Partial Content
* A* b2 m( T9 W- H, F' p% zClient Request Redirected
" B4 Z- ?+ J; V6 ]5 D
300 Multiple Choices
8 z* Q4 p" T+ E& S, u# J301 Moved Permanently
) X5 _& v& M4 T1 z
302 Moved Temporarily
/ D9 W; m/ k8 [; |, d: @+ F& Y# U D303 See Other
, D" G3 Z' O6 q! t$ N" D' V& `304 Not Modified
, K. T% {+ v! J( k. H# r" a1 J
305 Use Proxy
" g. K5 h2 {5 f7 n9 IClient Request Errors
+ i: l$ J5 k6 c+ H$ B( `8 a400 Bad Request
4 y+ D2 h9 a" n: V
401 Authorization Required
0 N! z! j1 D2 u: J0 I) M n. j
402 Payment Required (not used yet)
" t- ^- v/ @/ Y9 J403 Forbidden
$ A6 h1 h, b8 N2 [
404 Not Found
4 C# s8 g. E; D405 Method Not Allowed
' c6 r7 w" Y, s* [0 p! w: h. S406 Not Acceptable (encoding)
! Z8 v; a- O: ~. R1 [! `407 Proxy Authentication Required
: s2 F% y: A! {/ K, ~( \9 ?0 f& a
408 Request Timed Out
+ k6 n! y% p. _% }7 `409 Conflicting Request
% K9 Z( C1 ^, n2 K6 O3 ]# U {: J
410 Gone
1 s6 n" `0 T" Q( Z- v) {3 h5 F! a5 x% b411 Content Length Required
8 M; e3 K- F& l9 [" t
412 Precondition Failed
6 J" H% C8 {6 j. Y( F/ l413 Request Entity Too Long
9 i# w# r, v3 t4 N. r; H x, J; s0 _ c414 Request URI Too Long
# M$ D- ^. h6 w0 P( r. f
415 Unsupported Media Type
5 J! U% C' _9 o7 \0 s& CServer Errors
" c" ]9 Z5 }' @1 F, F" u' s9 D500 Internal Server Error
r$ Y% I6 m5 U: a+ y9 A1 y
501 Not Implemented
' d3 f x& h1 S( E m
502 Bad Gateway
% a/ k9 {3 C, ]: T
503 Service Unavailable
! X! @& c5 ]! Z2 W/ q. F! R0 s1 d
504 Gateway Timeout
5 m$ V9 Y2 m' f* `505 HTTP Version Not Supported
4 a+ T+ t* {1 C# K+ T
' ~6 f( B/ N$ {9 N P9 P( `4 C; P2 ~3. Password Protection 密码保护
+ v) l5 h7 ]0 c% JOfficial document: Authentication, Authorization and Access Control
1 I, V2 q7 l& T4 o3 g5 q
假设密码文件为.htpasswd
1 L. T* v9 |$ c% y0 h
AuthUserFile /usr/local/safedir/.htpasswd (这里必须使用全路径名)
8 z) ^8 k; V$ n; B, Q) O1 b
AuthName EnterPassword
1 n6 m- ^: r& w% B
AuthType Basic
L" V0 y7 ]" \两种常见验证方式:
' P* _2 y; q1 h$ X0 T3 C: H$ g! N
Require user windix
5 L6 p& }: v1 g' H, ^' Z" K( X(仅允许用户windix登陆)
1 ~; a7 x! w) W# ?; i
Require valid-user
; G& S8 L8 z" B
(所有合法用户都可登陆)
! Q, g! a$ _) k1 U) q: ZTip: 如何生成密码文件
' H8 \1 j9 \. M% i1 O9 Y9 [7 C使用htpasswd命令(apache自带)
% J! c: q1 v# T! d& K3 ^& z' Q
第一次生成需要创建密码文件
$ N, |9 ~+ E' ?- yhtpasswd -c .htpasswd user1
$ |+ w/ ]9 ]. x0 b8 S5 D& u; A B- |之后增加新用户
0 s. B# ?$ W phtpasswd .htpasswd user2
3 H/ P) M: W) C9 _. j- ^6 e5 w6 f5 \' _6 X. g D/ B
4. Enabling SSI Via htaccess 通过htaccess允许SSI(Server Side Including)功能
~& U& C. k! \% o7 ^3 AAddType text/html .shtml
' b: g; r) g; L0 X
AddHandler server-parsed .shtml
+ O, k- k. h. A: @7 n9 u% s% E9 _Options Indexes FollowSymLinks Includes
_4 }6 o: Q8 f& S9 N- S
DirectoryIndex index.shtml index.html
) v. h" c" I& j$ }& X6 \* ~% @( K( h2 b" K
5. Blocking users by IP 根据IP阻止用户访问
) R+ u6 f2 C& x! q
order allow,deny
# v1 y2 s Y1 n- Z$ B- h7 U
deny from 123.45.6.7
& T% n4 U( @' N; z' @
deny from 12.34.5. (整个C类地址)
1 u4 ^ W4 n. K' a6 y' |
allow from all
1 j( f) R n9 R! Y
& X) a( H V7 F7 L6. Blocking users/sites by referrer 根据referrer阻止用户/站点访问
2 B" e4 P0 b; I
需要mod_rewrite模块
+ \* U& i8 V9 \- }例1. 阻止单一referrer: badsite.com
u& Q' {6 F5 D" _( F
RewriteEngine on
3 S7 ]3 ^6 A5 l( e; V; _' E5 Z k# Options +FollowSymlinks
6 M/ Q3 A5 z! ^6 ]2 m }, V3 e3 PRewriteCond %{HTTP_REFERER} badsite.com [NC]
) P) I$ `) ?+ D4 P8 ~RewriteRule .* - [F]
9 {$ w% k4 ~; Z% `- Z! W
例2. 阻止多个referrer: badsite1.com, badsite2.com
: ]/ n6 g/ O8 `+ _RewriteEngine on
* C a4 P1 J( a2 m# Options +FollowSymlinks
' f- L3 ]9 U% h. \# m
RewriteCond %{HTTP_REFERER} badsite1.com [NC,OR]
, K; B) P. Y8 hRewriteCond %{HTTP_REFERER} badsite2.com
) A- s4 v3 j9 v) N7 b( K' J
RewriteRule .* - [F]
7 S) ?4 F1 [( l) c! m& Z[NC] - 大小写不敏感(Case-insensite)
2 Q8 _+ z" [5 I[F] - 403 Forbidden
3 ]# M& H( V( _4 B注意以上代码注释掉了”Options +FollowSymlinks”这个语句。如果服务器未在 httpd.conf 的 段落设置 FollowSymLinks, 则需要加上这句,否则会得到”500 Internal Server error”错误。
' O$ I1 H W: ^2 j5 ]3 i @& k9 W
7 |4 [; _4 a' w' y6 z' h7. Blocking bad bots and site rippers (aka offline browsers) 阻止坏爬虫和离线浏览器
% g* M- t+ x H5 u; M/ m1 V1 S
需要mod_rewrite模块
& u( }: @& |" g( K: P9 ]; b# M坏爬虫? 比如一些抓垃圾email地址的爬虫和不遵守robots.txt的爬虫(如baidu?)
* [, o8 H" e4 f/ D E+ A) g可以根据 HTTP_USER_AGENT 来判断它们
M! `; B, _1 u( t/ n( K5 k4 w(但是还有更无耻的如”中搜 zhongsou.com”之流把自己的agent设置为 “Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)” 太流氓了,就无能为力了)
G( g- Y9 D- w; J' e* U5 B
RewriteEngine On
6 Y$ M( R( u$ O' x; B4 U5 h$ MRewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
7 \5 ^$ k- ^2 p8 o
RewriteCond %{HTTP_USER_AGENT} ^Bot mailto:craftbot@yahoo.com [OR]
0 ~8 L+ f6 k, L h
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
1 V5 ~ g) ~- X$ h3 t! B! P/ m
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
2 E8 S- k: j" S
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
# x! d/ {$ ^4 v3 c7 @9 i
RewriteCond %{HTTP_USER_AGENT} ^Download Demon [OR]
( s0 u# M+ w4 fRewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
. e9 N- @2 v2 f: B( pRewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
5 G0 U) D. a8 X9 r
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
7 E( {! i. ?0 B4 k
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
. Z" e2 {) r+ {+ H7 n! C. y
RewriteCond %{HTTP_USER_AGENT} ^Express WebPictures [OR]
4 f! F- e2 i. e# y; u4 N8 mRewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
/ U. E5 ?1 z8 F2 Q; SRewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
U" f. P' q, c% X2 A/ Q
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
/ U4 \* a2 E+ F ?4 K2 D+ o$ Y I! cRewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
8 y0 N0 B- Y0 M* f
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
, p' P+ ^$ [8 ?- m4 b* h& \
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
9 B1 y7 c9 s4 M& hRewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
" n {+ m2 F( R- P+ v- z+ a' ], ARewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
( G+ c6 X: T" v$ Q9 b/ w
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
" t* n1 [' {" R. t f. ^RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
, q; A0 `- r" c# G0 GRewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
& ^7 T7 F& \) {4 y, r+ x
RewriteCond %{HTTP_USER_AGENT} ^Image Stripper [OR]
4 y. v* m9 l, o) `; x' r/ gRewriteCond %{HTTP_USER_AGENT} ^Image Sucker [OR]
* i+ }* ]0 K9 f! k9 b# hRewriteCond %{HTTP_USER_AGENT} Indy Library [NC,OR]
5 M' l* Z) B: V8 tRewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
6 A2 F" o9 o# n( k! H5 _RewriteCond %{HTTP_USER_AGENT} ^Internet Ninja [OR]
+ e2 C, q# Y5 z) g$ u, W! hRewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
# X' j# u- u, E
RewriteCond %{HTTP_USER_AGENT} ^JOC Web Spider [OR]
. R `3 I/ S0 }( a; w& G
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
* n: `2 A! X) h- V
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
& |7 |# ]0 [$ x0 g% C( DRewriteCond %{HTTP_USER_AGENT} ^Mass Downloader [OR]
% M- {4 i& S8 I7 g7 B% t' W( g+ ERewriteCond %{HTTP_USER_AGENT} ^MIDown tool [OR]
# q- ~9 p* o; b% h# W/ A
RewriteCond %{HTTP_USER_AGENT} ^Mister PiX [OR]
6 u6 V" k* a" C9 o
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
4 J& J. D* s" N, q. n
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
0 K0 \- m: a" ^' rRewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
, q3 R% k1 _% p! i
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
4 X/ o/ j2 ?( z w3 x+ b
RewriteCond %{HTTP_USER_AGENT} ^Net Vampire [OR]
5 W7 \! Q- i4 `+ o; x6 u# f4 |RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
4 |: K5 R. M2 G. c$ HRewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
2 y; l6 z, f5 K _* b' V5 D7 PRewriteCond %{HTTP_USER_AGENT} ^Offline Explorer [OR]
7 A# i3 { U4 e# x2 x- [: TRewriteCond %{HTTP_USER_AGENT} ^Offline Navigator [OR]
" u; q0 E, K( H$ @RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
1 ?+ j3 G- f4 `2 R3 @; U3 F
RewriteCond %{HTTP_USER_AGENT} ^Papa Foto [OR]
- @2 X+ k% q! |+ R, \8 N" Y7 {
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
. H$ o9 u8 {0 I
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
8 A$ h* ]" _0 e$ j- j$ kRewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
& E3 [ E# o, M7 l8 RRewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
% P% B' D1 S6 I: ^- }4 r+ i7 G
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
" K. y5 [) w( U6 aRewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
+ d: o4 R) S2 c' j. ?7 @: l0 rRewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
" c0 w6 ]9 Q! G) X' o# L! gRewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
% w9 x7 z3 k5 m$ [8 O+ ~4 e( SRewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
1 [3 B. V# f5 e; k2 y& T7 NRewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
, @: q0 V/ {; e. `
RewriteCond %{HTTP_USER_AGENT} ^Teleport Pro [OR]
! a2 B1 x+ s: \) Y( N7 ?RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
1 ?: X2 |2 V$ ]; K1 p( |" \
RewriteCond %{HTTP_USER_AGENT} ^Web Image Collector [OR]
. T! E" _0 m% ^) y; H3 U
RewriteCond %{HTTP_USER_AGENT} ^Web Sucker [OR]
( G: m- R7 W4 f9 {' o( ~4 l
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
/ [4 q, |: {" ~$ p4 }$ R8 ^RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
7 Z. G3 d, I+ V y0 X' y
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
3 s$ c7 Y2 w8 e0 Y0 r: K
RewriteCond %{HTTP_USER_AGENT} ^WebGo IS [OR]
* e- n) q V. I4 v2 u# q, R
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
A S& Z: N. o7 D& {0 o
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
) X; R d+ d0 hRewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
" `( [4 @1 t0 x+ C a
RewriteCond %{HTTP_USER_AGENT} ^Website eXtractor [OR]
2 j* ?; ?) R1 u. c, h; x& i! p- IRewriteCond %{HTTP_USER_AGENT} ^Website Quester [OR]
3 w/ n6 A( a7 d0 f
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
: t: b0 U+ }0 F) {7 `$ }4 c
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
& w# X3 O9 g* u' U V3 g
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
8 b# B A% v, _! k
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
: S1 z3 v/ [( L" F% dRewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
7 ^8 ]2 i6 P1 l" {- T8 g
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
/ w- C0 [ S/ z
RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [OR]
! s& {! h i! J# N
RewriteCond %{HTTP_USER_AGENT} ^Zeus
. z7 Q" n# S% Y; |
RewriteRule ^.* - [F,L]
* h Q6 |8 [$ m/ o" R0 l8 r
[F] - 403 Forbidden
0 n9 r v7 P" Q9 L8 t. o* J" O. ~$ w- I[L] - ?
; W& c7 _6 [# [- M7 ?2 F
! i! _: e n& X, `7 P
8. Change your default directory page 改变缺省目录页面
8 ~ Z! n/ E: z
DirectoryIndex index.html index.php index.cgi index.pl
\+ g3 P# _; ~
% H1 K- j& g, N9 \9. Redirects 转向
# g, Z. F. ~! `' [9 l; {& Y单个文件
8 L3 M- t: I0 g: J5 ]6 i) Q
Redirect /old_dir/old_file.html
http://yoursite.com/new_di...
3 T- t- L" q9 k: N! R3 \5 k整个目录
, e. Y- ^$ J; cRedirect /old_dir
http://yoursite.com/new_di... 3 L2 M& u. V% g4 g; i" g
效果: 如同将目录移动位置一样
N0 w' W) w# j k+ v' mhttp://yoursite.com/old_di... ->
http://yoursite.com/new_di... $ e3 `5 E" ]4 g3 A. W; u
http://yoursite.com/old_di... ->
http://yoursite.com/new_di...
Q6 E2 f6 A; @ t/ V" g" ?3 STip: 使用用户目录时Redirect不能转向的解决方法
# k) Q- _, i Z( T4 [当你使用Apache默认的用户目录,如
http://mysite.com/~windix,当你想转向
http://mysite.com/~windix/...时,你会发现下面这个Redirect不工作:
+ I; Q( T1 L }6 z& C& e
Redirect /jump
http://www.google.com 4 b9 D4 N/ K( N5 _) [
正确的方法是改成
$ Y. ~" Q: d* T$ j2 k1 t7 ]Redirect /~windix/jump
http://www.google.com |+ k& H* K0 ]3 A, i
(source: .htaccess Redirect in “Sites” not redirecting: why?
* a$ @+ `7 W+ t8 @8 n)
2 g1 v4 p$ b/ j) c' y% N4 H, O; o
, y/ _4 ?- {9 \9 g10. Prevent viewing of .htaccess file 防止.htaccess文件被查看
) C9 x/ p3 R& o9 s
order allow,deny
7 ]6 f7 U1 l6 M6 e1 _& l
deny from all
. W' D& D4 ]% \8 f4 S) ~$ H( O: _6 L" o
11. Adding MIME Types 添加 MIME 类型
% A6 ?* m: f: g
AddType application/x-shockwave-flash swf
3 ^* w& B( K% t1 ZTips: 设置类型为 application/octet-stream 将提示下载
' b! q/ C! l& I% }) u" l: F7 L' ? w
- p; Q* h& X: F% ]0 G12. Preventing hot linking of images and other file types 防盗链
7 \3 t B1 k+ O' {3 B& J需要mod_rewrite模块
$ g6 M- s# Z' V
RewriteEngine on
% r( e: J6 a' l- G
RewriteCond %{HTTP_REFERER} !^$
/ H/ H6 {6 l- }RewriteCond %{HTTP_REFERER} !^
http://(www/.)?mydoma...*$ [NC]
6 j; @5 [9 D9 i+ Y
RewriteRule .(gif|jpg|js|css)$ - [F]
; y+ Q$ H5 g. c8 j7 s
解析:
% ` P( ?. P! P若 HTTP_REFERER 非空 (来源为其他站点,非直接连接) 并且
' ]5 O' c1 ?; P0 ^( c# d. X
若 HTTP_REFERER 非(
www.)mydomain.com开头(忽略大小写[NC]) (来源非本站)
, c3 t( N m$ ?" e. z8 h4 p- T
对于所有含有 .gif/.jpg/.js/.css 结尾的文件给出 403 Forbidden 错误[F]
. F0 g6 C1 X$ O/ r. ?, }+ h也可指定响应,如下例显示替换图片
* I( r; K8 ?1 g K+ IRewriteRule .(gif|jpg)$
6 v! ~5 @7 ?0 O B4 T
[R,L]
. a1 y1 ]8 \4 g# S4 k[R] - 转向(Redirect)
* m( s& b4 g. u q[L] - 连接(Link)
$ @) ]' T* t. u' E- r- l% m% a# O7 }! w. x" J7 W% T' h( V
13. Preventing Directory Listing 防止目录列表时显示
5 Y8 S& A) Q) v
IndexIgnore *
; m1 d3 B3 F0 C3 @4 V* W
IndexIgnore *.jpg *.gif
& n0 |% Z9 U1 l; p: p0 Y, q
Tips:
; Q* O5 `! |2 ~7 z5 p) p
允许目录列表显示: Options +Indexes
* T) s- A- t1 D+ U
禁止目录列表显示: Options -Indexes
3 T5 [4 I6 c9 h3 t1 o9 w4 H显示提示信息: 页首 文件HEADER, 页尾 文件README