一、.htaccess简介
! x" U9 s4 s+ e5 D& C1.什么是.htaccess
: s" X: X3 ?: G( Z7 P$ f9 e" j: m .htaccess是一个纯文本文件,里面存放着Apache服务器配置相关的一些指令,它类似于Apache的站点配置文件,如httpd.conf(Apache2已经支持多站点,因此你的站点配置文件可能在/etc/apache2/conf.d/目录下)。) b2 |7 F' z0 u5 a
.htaccess与httpd.conf配置文件不同的是,它只作用于当前目录。另外httpd.conf是在Apache服务启动的时候就加载的,而.htaccess只有在用户访问目录时加载,开销大、速度慢。
" n0 y$ o9 M" h7 Y8 z$ H; g+ X 既然如此,为什么我们还要用.htaccess呢?因为它配置起来简单,它还支持重定向、URL重写以及访问验证,另外它管理起来很方便,可以很好适应网站迁移。总之,各有优缺点,主要就看你是要从全局考虑还是只配置单个目录。
! u* U# e `4 v, j3 ~8 S# U5 g4 `2.AllowOverride All
: L/ l' d- x% R8 o" O# R通常情况下,Apache是默认启用.htaccess的,但是为了以防万一,请检查一下自己站点的配置文件,如httpd.conf,是否有这行:
% l @# f% M& L这行允许重写配置文件。也就是如果能够从.htaccess加载配置文件,那么就以.htaccess为配置文件对其所在目录进行配置。1 { y6 _6 Y8 }9 D. V
3.500错误
+ S6 ^& H2 o; G4 P$ A 如果你租用了云服务提供商的主机或者空间,那么他们可能不会给你读写httpd.conf文件的权限,你也不可能检查AllowOverride命令参数是否为All,这时,你可以新建一个目录,在里面写一个.htaccess文件,文件中随意写入一些服务器看不懂的东西,然后访问该目录里的一个页面,耐心等待500错误的出现。
! a0 v# Q2 `0 u% h6 o# z0 x1 y# | 如果没有出现,那么.htaccess没有被启用,你需要向你的服务供应商寻求帮助;如果出现了,那么恭喜你,你可以对当前目录重写Apache配置。2 k7 N% t0 V/ A, n7 E/ j3 t
注意:.htaccess语法错误可能会影响整个站点,如果你不确定这样做是否安全,请联系你的云服务供应商。8 e2 x) ~8 F( ^4 m( |
二、.htaccess访问控制(Allow/Deny)9 x. `1 b$ y$ e
1.访问控制基础:Order命令
0 N1 I3 J! O4 y4 h& G3 x为了限制用户访问一些关键目录,.htaccess可以提供目录访问限制。你只需要在要限制的目录中,加入如下.htaccess文件:
/ V" ?2 }- U0 a' o* }- # no one gets in here!7 c( w' m8 H7 c7 R5 j; M8 h
- deny from all
复制代码 这会限制所有用户通过浏览器访问该目录,这太一刀切了,因此我们还可以增加一些特定的条件,如允许指定IP地址的访问:
- u3 X5 ^; v/ R) f, R% J- Order Allow,Deny
( M; \! J0 k) a! b - Deny from All2 {5 I, L- A: Q6 A# A+ i
- Allow from 192.168.0.0/24
# Y6 u7 D ]. _2 q; J. s7 G
复制代码 Order命令是一个难点,也是配置apache的基础,它决定了Apache处理访问规则的顺序。 K2 w9 O' j, y1 [1 ]5 i7 z
通过Allow,Deny参数,Apache首先找到并应用Allow命令,然后应用Deny命令,以阻止所有访问。- L* m/ m% O% W1 y
通过Deny,Allow参数,Apache首先找到并应用Deny命令,然后应用Allow命令,以允许所有访问。
/ ]; Y, j( b1 j% K了解Order的用法后,再仔细考虑下上面的例子,你或许能够发现Deny命令是多余的,以下用法和之前的描述语义相同:! d- M0 o' m6 z; w1 Q4 y3 F, e
- Order Allow,Deny
, E. [8 K/ ^+ }" F - Allow from 192.168.0/24
复制代码 2.利用.htaccess过滤域名或网络主机(Allow/Deny)
' P# {0 A5 W3 L下例可以限制所有含有“domain.com”的网络主机访问网站:
4 O' _# g# ?, u9 s$ \- Order Allow,Deny+ E+ h$ [9 X, g3 e' k' Q
- Allow from all
: L% Y- }+ | M9 l6 O5 Z - Deny from .*domain\.com.*
复制代码 3.利用.htaccess禁止访问指定文件(Files)
# K% `9 A6 D5 PFiles命令可以用于过滤指定文件:' D; Z( b; W& Q9 I2 s/ k
- # secure htaccess file! H' q# ~4 k3 P! T1 r$ d& Y
- <Files .htaccess>! s- c; ?% [0 U" \2 A
- order allow,deny5 a$ M# z& S: |7 `
- deny from all- C8 `6 u6 E2 d# h
- </Files>
复制代码 4.利用.htaccess禁止访问指定文件类型(FilesMatch)- o( n K- [; e) M' M. y [
下面的代码将限制访问所有.log和.exe文件:
$ P$ I4 X- C$ a$ i: W- <FilesMatch ".(log|exe)[ DISCUZ_CODE_629 ]quot;>
; r& `4 c- Y9 b0 C - Order allow,deny* t" r( u& Y( Z$ ^. e, L
- Deny from all
) H2 o- c9 l# l" j/ c: Q) M - </FilesMatch>
复制代码 我们还可以通过Files命令描述文件类型,但是需要在命令后面加一个波浪线(~),该符号启用Files命令的正则表达解析功能:% F3 k$ R8 _; S6 _; u
- <Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">
2 d& _3 j1 ~; M) l" a - Order allow,deny
2 j/ ]2 L- b% x. r1 g - Deny from all
- R5 { C6 d" I; `/ d# @ - Satisfy All
# C2 a# o/ y- o8 K1 v3 l8 z - </Files>
复制代码 有以下几点需要读者注意:7 z, }. t# g0 F8 o
Files之后的波浪线用于开启“正则表达式”分析。请注意,这是个过时的用法,Apache更推荐使用<FilesMatch>指令。
; f! e* D6 a" B! m 正则表达式必须在双引号之间。
2 A7 A9 F% j4 q1 L/ P7 G 双引号中的“管道符”(|)用于将两种文件类型(.log和.exe)分开,相当于逻辑“或” ?; d2 U x! d
Order命令必须嵌在Files节(Section)中,否则将会应用到所有文件
5 k8 ^5 E( Z, J7 A9 I7 f Satisfy All表示必须同时满足主机级别(Allow/Denay)和用户级别(Require)的限制,All是默认值,该行可以省略。, @+ M/ W1 ^; x
三、利用.htaccess进行密码保护与验证
. q, S, x: M* w1.配置.htaccess8 t7 w9 j5 H$ |' U5 [
- AuthType Basic
5 ?% O9 r- C) t4 p - AuthName "restricted area". ~5 b3 d! N- A" L' M
- AuthUserFile /usr/local/var/www/html/.htpasses
. ~. _; W* }! T& ` M3 { - require valid-user
复制代码 这个配置文件可以保护.htaccess所在的整个目录,简单说明下参数:
4 H, r8 [! W+ _- G } AuthType:验证类型为基本类型,密码以明文方式传输到服务器上
! G3 U, h2 [, t6 \. n/ L4 \8 \ AuthName:验证提示,会出现在验证对话框中
0 A+ s" e6 m5 m- P- |9 d AuthUserFile:验证配置文件,用于匹配用户名与密码,该密码是加密保存的( u- B* ^5 V- @$ O$ ^
require valid-user:只有在AuthUserFile中出现的用户才可以通过验证
9 ~9 x: u4 u& o' Q如果验证失败,则会出现401错误。2 p3 A7 V9 G* w
2.生成.htpasses文件
8 q M/ d4 F. u; Z% y+ {5 b如何生成.htpasses文件呢?我们通过htpasswd命令生成密码文件:2 L& A z: j* v& q3 h0 J5 _) k
- htpasswd -c /usr/local/var/www/html/.htpasses lesca
复制代码 它会提示你输入密码,并确认。之后将密码文件.htpasses保存在/usr/local/var/www/html/目录下。
: u+ w( w& d* A' ~3.对文件进行密码保护& c' V; N9 ]- U* Q
保护与.htaccess在同一目录下的文件secure.php:% q: l1 R, C1 V& r5 t. p
- # password-protect single file* e$ n& i1 j6 I1 e# s0 n9 g* \" W
- <Files secure.php>
. @: }; @2 W) M% W# P - AuthType Basic' \9 R3 y2 L+ J0 q" Y
- AuthName "Prompt"/ k: d8 o: W' d0 n' P; [% T" V* o
- AuthUserFile /home/path/.htpasswd
1 l& a! S% q; A - Require valid-user" l6 r8 R, P0 q
- </Files>
复制代码 保护.htaccess所在目录下的多个文件:/ n, g B! {) w& u
- # password-protect multiple files
& ^* {! m0 O: f - <FilesMatch "^(execute|index|secure|insanity|biscuit)*[ DISCUZ_CODE_634 ]quot;>. i' {$ ?/ A# X0 Q
- AuthType basic7 z8 H" t! W5 Q" D: j
- AuthName "Development"
2 F3 ` R4 ?, s9 u$ D/ K/ {+ L# L - AuthUserFile /home/path/.htpasswd+ t7 s3 @7 x& A& H( a3 K( z
- Require valid-user
- } i8 s6 z% l' l - </FilesMatch>
复制代码 4.对指定IP进行密码保护) z; X- e% O C+ ^" _3 O- t
仅允许IP地址为88.88.88.88的主机直接访问该目录,其他IP需要验证。6 k) e! \/ ?/ r& r
- AuthType Basic$ s/ M& y, _7 f$ N2 H' @
- AuthName "Personal"
' ]7 W1 i$ l/ ?( M- L/ j - AuthUserFile /home/path/.htpasswd$ ~; ^# D! g6 i3 A* i" n7 ~
- Require valid-user
6 q; T4 U; E) o0 u: @+ a& I - Allow from 88.88.88.88, k: {. `; K3 H/ F
- Satisfy Any
复制代码 5.安全性
0 k* l- Q5 o3 \! L* T% U% c7 y: \出于安全考虑,将.htpasses文件存放在WEB目录树之外也许是个好方法,但是由于.htpasses是隐藏文件,而且Apache不会输出隐藏文件,因此可以满足基本的安全要求。这是通过在主配置文件中加入如下限制实现的:
! c8 t0 F# U6 L- <Files ~ "^\.ht">9 e$ d% i" L* F3 y& ^! i1 _
- Order allow,deny
1 g- w: M7 V$ d- @/ ]7 i1 A - Deny from all! G) t3 X Z: o7 p6 t6 d; L% e" |9 {
- Satisfy All4 }, n) J4 U( T, t: c+ F
- </Files>
复制代码 一般而言,这是默认设置,用户无需手动添加。我们唯一需要担心的是密码在网络传输过程中是明文形式,这很容易被黑客破译。Coz提供了一个开源项目Pajamas可以在本地利用JS对密码进行MD5加密,有兴趣的读者可以前去研究一下。! t% {, _* _/ {, B% q6 O# t
四、目录浏览与主页
* }; ]5 U0 S/ E4 t* A$ Y1.启用目录浏览
' t/ ]( P$ D; u6 r. j+ T- # enable directory browsing* g! D, R7 d8 x+ b2 |7 n2 p9 d7 z
- Options All +Indexes
复制代码 2.禁用目录浏览
8 U7 z, n$ o$ D+ F# U9 j- # disable directory browsing
8 [* d7 I2 O2 X8 t4 b - Options All -Indexes
复制代码 我们还可以通过IndexIgnore指令来禁用目录浏览。
& k6 b9 }2 w- E5 N4 y A: I) n$ F- # prevent folder listing- x8 W+ Z% Y. u: |: o
- IndexIgnore *
复制代码 通过IndexIgnore指令,我们可以禁止对指定类型的文件浏览:' m$ n( f5 b/ D0 U1 n, ~
- # prevent display of select file types
9 w: U7 a# I% o% O a0 i - IndexIgnore *.wmv *.mp4 *.avi *.etc *.rm *.rmvb *.exe *.mp3 *.mpeg *.mov *.asf *.navi *.3gp *.mkv *.flv *.f4v
复制代码 3.自定义目录浏览
. U9 Y1 U( u5 S3 N如果你希望Apache在展示你的WEB目录时看起来与众不同,那么你需要启用FancyIndexing选项:
' ?5 n1 A" t; H9 s3 n" G- <IfModule mod_autoindex.c>! o: L' n$ d3 F
- IndexOptions FancyIndexing
, k: s z4 _% ^, l - </ifModule>
复制代码 通过这个选项,你可以实现自定义图标、添加文件类型描述、按日期排序等。; ]. Z7 h( E4 I8 S, E
4.配置目录主页文件 [8 N7 F7 z- o. M6 Y2 Q q# M* b, O
即使启用了目录浏览,Apache未必会展示该目录的内容,因为该目录可能存在像index.htm这样的默认主页文件。Apache会有限展示主页文件,我们可以通过.htaccess设置:
/ q$ S: U3 x7 \- DirectoryIndex index.html index.php index.htm
复制代码 5.配置错误页面; O1 m0 i9 I5 v) R3 \5 D
如果Apache遇到错误,就会输出错误页面。配置自定义的错误页面,也许可以挽留即将离开的用户。, p( F/ E7 E' _0 W6 d
- # custom error documents
' O: U8 o3 A$ g# `- h - ErrorDocument 401 /err/401.php
& I7 b, J# K4 \ - ErrorDocument 403 /err/403.php
4 I7 q5 \1 K# ?0 ? - ErrorDocument 404 /err/404.php1 A6 @. [6 Q% T1 l
- ErrorDocument 500 /err/500.php
复制代码 |