一、.htaccess简介
; q4 W' v5 c( v9 d( m1.什么是.htaccess
0 P# k [7 `1 I1 @/ h; _7 @4 [ .htaccess是一个纯文本文件,里面存放着Apache服务器配置相关的一些指令,它类似于Apache的站点配置文件,如httpd.conf(Apache2已经支持多站点,因此你的站点配置文件可能在/etc/apache2/conf.d/目录下)。
, D) L c0 ?# h- P2 ^5 k# x" X, v7 i .htaccess与httpd.conf配置文件不同的是,它只作用于当前目录。另外httpd.conf是在Apache服务启动的时候就加载的,而.htaccess只有在用户访问目录时加载,开销大、速度慢。
N( D- W9 _4 e( K* X 既然如此,为什么我们还要用.htaccess呢?因为它配置起来简单,它还支持重定向、URL重写以及访问验证,另外它管理起来很方便,可以很好适应网站迁移。总之,各有优缺点,主要就看你是要从全局考虑还是只配置单个目录。
, S5 x3 z% n* C5 z2 I* J( S2.AllowOverride All/ P5 X, Q) \7 L6 H9 C
通常情况下,Apache是默认启用.htaccess的,但是为了以防万一,请检查一下自己站点的配置文件,如httpd.conf,是否有这行:% R L6 ]5 y8 C" S
这行允许重写配置文件。也就是如果能够从.htaccess加载配置文件,那么就以.htaccess为配置文件对其所在目录进行配置。
1 Z5 `5 z" l' ~. Z- w7 X3.500错误) i# T4 Z8 Y, {; ~+ {3 [
如果你租用了云服务提供商的主机或者空间,那么他们可能不会给你读写httpd.conf文件的权限,你也不可能检查AllowOverride命令参数是否为All,这时,你可以新建一个目录,在里面写一个.htaccess文件,文件中随意写入一些服务器看不懂的东西,然后访问该目录里的一个页面,耐心等待500错误的出现。. l: R) v7 [/ k& n% e
如果没有出现,那么.htaccess没有被启用,你需要向你的服务供应商寻求帮助;如果出现了,那么恭喜你,你可以对当前目录重写Apache配置。
h) ]8 o: ?2 G# Z# j1 u5 b1 v注意:.htaccess语法错误可能会影响整个站点,如果你不确定这样做是否安全,请联系你的云服务供应商。
5 \. {" Q6 H& X; r9 |/ ~4 v* e二、.htaccess访问控制(Allow/Deny)
4 G' i% @( I# O7 A4 I! T0 e7 ?$ @1.访问控制基础:Order命令
9 m& [; R4 [7 q0 F为了限制用户访问一些关键目录,.htaccess可以提供目录访问限制。你只需要在要限制的目录中,加入如下.htaccess文件:6 N, i, G. Z# G5 Z4 d0 v
- # no one gets in here!2 t' \, F8 f+ \3 e7 C
- deny from all
复制代码 这会限制所有用户通过浏览器访问该目录,这太一刀切了,因此我们还可以增加一些特定的条件,如允许指定IP地址的访问:
, w5 e+ n9 F+ }5 S9 c6 X( F; z- Order Allow,Deny
3 S8 ~% u& ^- q - Deny from All# ?1 F; `/ W8 I% [) u
- Allow from 192.168.0.0/24 ; s1 i2 i+ b* v* X3 f0 |
复制代码 Order命令是一个难点,也是配置apache的基础,它决定了Apache处理访问规则的顺序。
. W% b' w$ Z! `) ] 通过Allow,Deny参数,Apache首先找到并应用Allow命令,然后应用Deny命令,以阻止所有访问。
4 D) r5 X$ ?3 A, a 通过Deny,Allow参数,Apache首先找到并应用Deny命令,然后应用Allow命令,以允许所有访问。
2 V3 g2 ?' z; V3 f. q! |了解Order的用法后,再仔细考虑下上面的例子,你或许能够发现Deny命令是多余的,以下用法和之前的描述语义相同:* V4 A4 }0 C) t
- Order Allow,Deny+ X! w a4 M3 ~& n. |
- Allow from 192.168.0/24
复制代码 2.利用.htaccess过滤域名或网络主机(Allow/Deny)# U( i$ @; Q% h2 w- ?$ F! c9 z
下例可以限制所有含有“domain.com”的网络主机访问网站:5 U+ R% z' \0 N( _! o
- Order Allow,Deny. r: M) w8 |; d% P0 V+ z
- Allow from all
) J! ?& ]7 J! F0 d0 {6 @ ~. H- o - Deny from .*domain\.com.*
复制代码 3.利用.htaccess禁止访问指定文件(Files)' l& T* n+ L1 ?; f
Files命令可以用于过滤指定文件:
1 f0 A! X ^9 r- # secure htaccess file
- h2 f' p$ v. G% d - <Files .htaccess>% K: R# T% |* T3 R" d' K
- order allow,deny
7 ]7 \/ r( d5 R3 W- |% I. c - deny from all, b3 r1 \- H" d5 c$ W! P
- </Files>
复制代码 4.利用.htaccess禁止访问指定文件类型(FilesMatch)2 N4 J2 B" H+ x) I. j: I5 ^
下面的代码将限制访问所有.log和.exe文件:
" w0 S3 S! w1 ~- <FilesMatch ".(log|exe)[ DISCUZ_CODE_629 ]quot;>
1 g/ T' V/ c. F& c- L# J6 {2 @ - Order allow,deny
' ]8 F: l0 p9 y- z2 Y - Deny from all' D( J% n5 N' [; z3 l
- </FilesMatch>
复制代码 我们还可以通过Files命令描述文件类型,但是需要在命令后面加一个波浪线(~),该符号启用Files命令的正则表达解析功能:
; E+ N5 w* L8 A/ H/ F- <Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">
$ c1 V3 z0 W0 Q" ?6 a - Order allow,deny8 z" w! }/ Z, J' v. R4 s* y
- Deny from all9 U6 u2 j, L1 D
- Satisfy All8 v$ ^5 N( Q: \7 [: ~
- </Files>
复制代码 有以下几点需要读者注意:
4 H8 Q' k, \; i! W9 z+ F9 z. t Files之后的波浪线用于开启“正则表达式”分析。请注意,这是个过时的用法,Apache更推荐使用<FilesMatch>指令。, V% h, H) g" d: O0 N
正则表达式必须在双引号之间。3 i0 y& ]0 W% o# @& F @6 [7 T
双引号中的“管道符”(|)用于将两种文件类型(.log和.exe)分开,相当于逻辑“或”3 D4 W* u! J$ w7 b# o
Order命令必须嵌在Files节(Section)中,否则将会应用到所有文件6 {6 z) l: n* [% y5 A3 K- h! p& c
Satisfy All表示必须同时满足主机级别(Allow/Denay)和用户级别(Require)的限制,All是默认值,该行可以省略。
3 N) Z. m7 e/ W7 |1 w! ]三、利用.htaccess进行密码保护与验证
! ?8 }9 L M3 C0 u4 D4 A1.配置.htaccess
) i3 w1 u# b0 L4 ]/ G* t- AuthType Basic/ A9 y5 S Z5 [
- AuthName "restricted area"
& q; j6 K+ g6 d - AuthUserFile /usr/local/var/www/html/.htpasses
3 Z! o; ` k$ I( i - require valid-user
复制代码 这个配置文件可以保护.htaccess所在的整个目录,简单说明下参数:7 J" _) K" i; X4 w h+ |
AuthType:验证类型为基本类型,密码以明文方式传输到服务器上8 I0 c" e0 x. G3 h3 A/ k
AuthName:验证提示,会出现在验证对话框中) @5 ^, T; H5 [, }4 s5 Y3 P1 ^
AuthUserFile:验证配置文件,用于匹配用户名与密码,该密码是加密保存的. h/ L9 W4 U3 c
require valid-user:只有在AuthUserFile中出现的用户才可以通过验证# X3 D! E) U+ R* {0 i: y5 _
如果验证失败,则会出现401错误。
: ~6 n+ k' @5 K B7 X2.生成.htpasses文件
" b3 ]( P0 x! N* P/ w如何生成.htpasses文件呢?我们通过htpasswd命令生成密码文件:" I5 C+ G7 _+ \" D5 `% @
- htpasswd -c /usr/local/var/www/html/.htpasses lesca
复制代码 它会提示你输入密码,并确认。之后将密码文件.htpasses保存在/usr/local/var/www/html/目录下。
; L. r7 X* J' _3.对文件进行密码保护8 Q: J: v& U1 N) ` R
保护与.htaccess在同一目录下的文件secure.php:( {2 A+ C! L' a0 l7 q
- # password-protect single file
9 P; A9 V+ C# T# r' k* j1 D - <Files secure.php>
, F' k( ]: [4 F/ F - AuthType Basic; O# \' a0 w0 D: L0 \5 q0 r3 Y
- AuthName "Prompt"
$ f0 {9 Q2 w, s - AuthUserFile /home/path/.htpasswd7 \" q5 x: h6 e0 M K& t
- Require valid-user& O$ b9 t! I4 b/ M& g N
- </Files>
复制代码 保护.htaccess所在目录下的多个文件:
8 i2 D* j+ J. a9 X8 l- # password-protect multiple files
2 j3 f- G% d5 o+ M3 P - <FilesMatch "^(execute|index|secure|insanity|biscuit)*[ DISCUZ_CODE_634 ]quot;>
: ?9 F3 p; A3 y; K' j; w% p& o - AuthType basic
1 u8 K* D( t# f4 E' M9 P - AuthName "Development"
% m& x6 c) P& Y) t+ |% y - AuthUserFile /home/path/.htpasswd; [- V4 v8 |. G1 c5 p) W
- Require valid-user
9 S; @4 i% y1 @( h& z - </FilesMatch>
复制代码 4.对指定IP进行密码保护! y$ C% t9 b+ i% M( h2 M! k7 T! T6 T! k
仅允许IP地址为88.88.88.88的主机直接访问该目录,其他IP需要验证。1 B$ I% D( D! n8 _* J6 m
- AuthType Basic- Z8 U3 g+ B- }: t7 N) E: g
- AuthName "Personal"* c0 O+ @3 @3 }) _7 w
- AuthUserFile /home/path/.htpasswd
5 T) ^- S9 R+ J# E x/ i - Require valid-user
7 x( r o- H5 k3 I6 @. _# p& O - Allow from 88.88.88.88
/ Y+ p! X: Q) Z9 j/ i8 q" v" f9 U - Satisfy Any
复制代码 5.安全性8 V" R3 L- h/ f+ M3 g9 L
出于安全考虑,将.htpasses文件存放在WEB目录树之外也许是个好方法,但是由于.htpasses是隐藏文件,而且Apache不会输出隐藏文件,因此可以满足基本的安全要求。这是通过在主配置文件中加入如下限制实现的:
y' @: t3 Z! B- <Files ~ "^\.ht">; p! n! G7 K q$ ]9 Z
- Order allow,deny) ~" I7 N7 ~" g" y5 N
- Deny from all+ Q9 \% A% c; }" v' V8 ]
- Satisfy All
! B* B* |% t @8 Q; V - </Files>
复制代码 一般而言,这是默认设置,用户无需手动添加。我们唯一需要担心的是密码在网络传输过程中是明文形式,这很容易被黑客破译。Coz提供了一个开源项目Pajamas可以在本地利用JS对密码进行MD5加密,有兴趣的读者可以前去研究一下。4 a6 t3 W( r6 e1 x4 U- q# Z
四、目录浏览与主页
1 E8 [6 x+ {- t/ J; {1.启用目录浏览( }* V0 \7 q( F; F1 c
- # enable directory browsing
; |3 F7 W3 H$ I+ l* m9 o( R - Options All +Indexes
复制代码 2.禁用目录浏览' j" n6 R" k' W4 |$ G, t6 e
- # disable directory browsing0 k& Z& v) i) w; N, [
- Options All -Indexes
复制代码 我们还可以通过IndexIgnore指令来禁用目录浏览。
% l8 ]0 ?* @6 X" k6 K i- # prevent folder listing
/ I' G& |( x' [4 t - IndexIgnore *
复制代码 通过IndexIgnore指令,我们可以禁止对指定类型的文件浏览:
" W4 b- y; y* H" _) S- # prevent display of select file types/ `& w/ g+ h1 B8 v. Q+ g
- IndexIgnore *.wmv *.mp4 *.avi *.etc *.rm *.rmvb *.exe *.mp3 *.mpeg *.mov *.asf *.navi *.3gp *.mkv *.flv *.f4v
复制代码 3.自定义目录浏览, H0 q% z5 X! `( I S4 D: k+ B
如果你希望Apache在展示你的WEB目录时看起来与众不同,那么你需要启用FancyIndexing选项:
, R9 b$ p4 v4 d- <IfModule mod_autoindex.c>0 M$ ]5 e+ ^6 v# V8 b6 S& W: M
- IndexOptions FancyIndexing# k# q! ~8 j, d5 ~' Q
- </ifModule>
复制代码 通过这个选项,你可以实现自定义图标、添加文件类型描述、按日期排序等。6 D- Q' z- f; b+ P' D: D
4.配置目录主页文件
# O1 _4 m" ~ U) H O即使启用了目录浏览,Apache未必会展示该目录的内容,因为该目录可能存在像index.htm这样的默认主页文件。Apache会有限展示主页文件,我们可以通过.htaccess设置:
^; W7 k, y9 t2 Y9 [6 X- DirectoryIndex index.html index.php index.htm
复制代码 5.配置错误页面
. H& m4 L' k3 C2 N2 N" H如果Apache遇到错误,就会输出错误页面。配置自定义的错误页面,也许可以挽留即将离开的用户。: q% a$ ~ C1 F& L6 o; |% X
- # custom error documents- e- B2 P1 ]: w; A7 j; b" `
- ErrorDocument 401 /err/401.php$ m/ Z+ Q% g) a2 r5 C
- ErrorDocument 403 /err/403.php# T5 ?" V/ ]& ]; K' B4 j/ n0 F$ N
- ErrorDocument 404 /err/404.php
! H; R u4 t/ Q! ?$ v - ErrorDocument 500 /err/500.php
复制代码 |