稳定互联,中美互联,站长交流,虚拟主机,香港主机,美国主机,虚拟空间,免费空间,免费VPS,免费域名

 找回密码
 立即注册
查看: 2908|回复: 0

[经验] .htaccess教程:简介、访问控制、验证、目录浏览控制

[复制链接]
发表于 2014-3-15 20:28:39 | 显示全部楼层 |阅读模式
一、.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
  1. AllowOverride All
复制代码
这行允许重写配置文件。也就是如果能够从.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
  1. # no one gets in here!2 t' \, F8 f+ \3 e7 C
  2. deny from all
复制代码
这会限制所有用户通过浏览器访问该目录,这太一刀切了,因此我们还可以增加一些特定的条件,如允许指定IP地址的访问:
, w5 e+ n9 F+ }5 S9 c6 X( F; z
  1. Order Allow,Deny
    3 S8 ~% u& ^- q
  2. Deny from All# ?1 F; `/ W8 I% [) u
  3. 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
  1. Order Allow,Deny+ X! w  a4 M3 ~& n. |
  2. 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
  1. Order Allow,Deny. r: M) w8 |; d% P0 V+ z
  2. Allow from all
    ) J! ?& ]7 J! F0 d0 {6 @  ~. H- o
  3. Deny from .*domain\.com.*
复制代码
3.利用.htaccess禁止访问指定文件(Files)' l& T* n+ L1 ?; f
Files命令可以用于过滤指定文件:
1 f0 A! X  ^9 r
  1. # secure htaccess file
    - h2 f' p$ v. G% d
  2. <Files .htaccess>% K: R# T% |* T3 R" d' K
  3. order allow,deny
    7 ]7 \/ r( d5 R3 W- |% I. c
  4. deny from all, b3 r1 \- H" d5 c$ W! P
  5. </Files>
复制代码
4.利用.htaccess禁止访问指定文件类型(FilesMatch)2 N4 J2 B" H+ x) I. j: I5 ^
下面的代码将限制访问所有.log和.exe文件:
" w0 S3 S! w1 ~
  1. <FilesMatch ".(log|exe)[        DISCUZ_CODE_629        ]quot;>
    1 g/ T' V/ c. F& c- L# J6 {2 @
  2. Order allow,deny
    ' ]8 F: l0 p9 y- z2 Y
  3. Deny from all' D( J% n5 N' [; z3 l
  4. </FilesMatch>
复制代码
我们还可以通过Files命令描述文件类型,但是需要在命令后面加一个波浪线(~),该符号启用Files命令的正则表达解析功能:
; E+ N5 w* L8 A/ H/ F
  1. <Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">
    $ c1 V3 z0 W0 Q" ?6 a
  2. Order allow,deny8 z" w! }/ Z, J' v. R4 s* y
  3. Deny from all9 U6 u2 j, L1 D
  4. Satisfy All8 v$ ^5 N( Q: \7 [: ~
  5. </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
  1. AuthType Basic/ A9 y5 S  Z5 [
  2. AuthName "restricted area"
    & q; j6 K+ g6 d
  3. AuthUserFile /usr/local/var/www/html/.htpasses
    3 Z! o; `  k$ I( i
  4. 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 `% @
  1. 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
  1. # password-protect single file
    9 P; A9 V+ C# T# r' k* j1 D
  2. <Files secure.php>
    , F' k( ]: [4 F/ F
  3. AuthType Basic; O# \' a0 w0 D: L0 \5 q0 r3 Y
  4. AuthName "Prompt"
    $ f0 {9 Q2 w, s
  5. AuthUserFile /home/path/.htpasswd7 \" q5 x: h6 e0 M  K& t
  6. Require valid-user& O$ b9 t! I4 b/ M& g  N
  7. </Files>
复制代码
保护.htaccess所在目录下的多个文件:
8 i2 D* j+ J. a9 X8 l
  1. # password-protect multiple files
    2 j3 f- G% d5 o+ M3 P
  2. <FilesMatch "^(execute|index|secure|insanity|biscuit)*[        DISCUZ_CODE_634        ]quot;>
    : ?9 F3 p; A3 y; K' j; w% p& o
  3. AuthType basic
    1 u8 K* D( t# f4 E' M9 P
  4. AuthName "Development"
    % m& x6 c) P& Y) t+ |% y
  5. AuthUserFile /home/path/.htpasswd; [- V4 v8 |. G1 c5 p) W
  6. Require valid-user
    9 S; @4 i% y1 @( h& z
  7. </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
  1. AuthType Basic- Z8 U3 g+ B- }: t7 N) E: g
  2. AuthName "Personal"* c0 O+ @3 @3 }) _7 w
  3. AuthUserFile /home/path/.htpasswd
    5 T) ^- S9 R+ J# E  x/ i
  4. Require valid-user
    7 x( r  o- H5 k3 I6 @. _# p& O
  5. Allow from 88.88.88.88
    / Y+ p! X: Q) Z9 j/ i8 q" v" f9 U
  6. Satisfy Any
复制代码
5.安全性8 V" R3 L- h/ f+ M3 g9 L
出于安全考虑,将.htpasses文件存放在WEB目录树之外也许是个好方法,但是由于.htpasses是隐藏文件,而且Apache不会输出隐藏文件,因此可以满足基本的安全要求。这是通过在主配置文件中加入如下限制实现的:
  y' @: t3 Z! B
  1. <Files ~ "^\.ht">; p! n! G7 K  q$ ]9 Z
  2. Order allow,deny) ~" I7 N7 ~" g" y5 N
  3. Deny from all+ Q9 \% A% c; }" v' V8 ]
  4. Satisfy All
    ! B* B* |% t  @8 Q; V
  5. </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
  1. # enable directory browsing
    ; |3 F7 W3 H$ I+ l* m9 o( R
  2. Options All +Indexes
复制代码
2.禁用目录浏览' j" n6 R" k' W4 |$ G, t6 e
  1. # disable directory browsing0 k& Z& v) i) w; N, [
  2. Options All -Indexes
复制代码
我们还可以通过IndexIgnore指令来禁用目录浏览。
% l8 ]0 ?* @6 X" k6 K  i
  1. # prevent folder listing
    / I' G& |( x' [4 t
  2. IndexIgnore *
复制代码
通过IndexIgnore指令,我们可以禁止对指定类型的文件浏览:
" W4 b- y; y* H" _) S
  1. # prevent display of select file types/ `& w/ g+ h1 B8 v. Q+ g
  2. 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
  1. <IfModule mod_autoindex.c>0 M$ ]5 e+ ^6 v# V8 b6 S& W: M
  2. IndexOptions FancyIndexing# k# q! ~8 j, d5 ~' Q
  3. </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
  1. DirectoryIndex index.html index.php index.htm
复制代码
5.配置错误页面
. H& m4 L' k3 C2 N2 N" H如果Apache遇到错误,就会输出错误页面。配置自定义的错误页面,也许可以挽留即将离开的用户。: q% a$ ~  C1 F& L6 o; |% X
  1. # custom error documents- e- B2 P1 ]: w; A7 j; b" `
  2. ErrorDocument 401 /err/401.php$ m/ Z+ Q% g) a2 r5 C
  3. ErrorDocument 403 /err/403.php# T5 ?" V/ ]& ]; K' B4 j/ n0 F$ N
  4. ErrorDocument 404 /err/404.php
    ! H; R  u4 t/ Q! ?$ v
  5. ErrorDocument 500 /err/500.php
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|WdidcNet ( 苏ICP备17005075号-1 )

GMT+8, 2025-11-27 15:28 , Processed in 0.005985 second(s), 8 queries , APCu On.

Powered by Discuz!

© 2010-2023.

快速回复 返回顶部 返回列表