.htaccess文件(分布式配置文件)提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。
用.htaccess做基于apache httpd的访问控制就是最常见的一种用法,
方法很简单,
apache默认编译下,authentication是enable的。
第一步,我们得建立一个目录访问控制的用户
如果我们原来的系统中没有建立过类似的帐户,我们就用一下命令
root@mysun:~# htpasswd -c /usr/local/apache2/conf/passwd test
按提示输入密码,这样就建立好了一个用户,
如果我们系统中原来有过用户(可以more一下conf下的passwd)
我们就可以在添加用户的时候去掉"-c"
第二步,写httpd.conf或任意apache配置文件,(当然了,我们默认情况下写httpd.conf)追加下列行,
<Directory /www/mysun/phpmysqladmin>
AuthName "test"
AuthType basic
AuthUserFile /usr/local/apache2/conf/passwd
// 请注意我在这里并没有用.htaccess
require valid-user
</Directory>
重启apache就目标文件夹"/www/mysun/phpmysqladmin"在被httpd请求访问的时候就有密码保护了。
这种密码保护方式被广泛地应用于类似PhpMysqlAdmin之类的没有管理员认证登录功能的页面的保护。
一般情况下,很多虚拟主机提供商为了方便,就直接定义了AuthUserFile到某个虚拟主机用户的家目录下的.htaccess,允许用户通过.htaccess文件自己修改配置。认为这样服务器管理员就可以免去频繁修改配置的烦恼,更有甚着,误认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。
为什么要避免使用.htaccess文件有两个主要原因:
首先是性能问题,如果AllowOverride启用了.htaccess文件,则Apache需要在每次用户请求某个目录时去该目录中查找.htaccess文件,因此,无论是否某个目录真正启用了.htaccess,都会导致性能的下降。
Apache会检查所有上级的目录中的.htaccess文件,以使所有有效的指令都起作用,所以,如果请求/www/mysun/service/webftp/files中的页面,Apache必须查找以下文件:
/.htaccess
/www/.htaccess
/www/mysun/.htaccess
/www/mysun/service/.htaccess
/www/mysun/service/webftp/.access
/www/mysun/service/webftp/files/.htaccess
我们看到,apache总共要访问6个额外的文件,即使这些文件都不存在。这对于服务器而言是相当恐怖的一个负荷。
其次是安全问题,这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的后果。
其实把文件夹配置相关信息写进.htaccess与服务器主配置文件里的实现的效果是一样的,并且把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。