使用htaccess进行访问控制的方法详解

发布时间:2020-12-03编辑:脚本学堂
本文介绍下,用htaccess文件进行访问控制的方法,通过实例加以介绍与学习。有需要的朋友参考下。

apache中,使用文件htaccess可以进行文件访问控制、阻止user-agent、用.htaccess阻止盗链(hot-linking)等。

下面我们来逐一介绍。

1,文件访问控制
利用 httpd.conf 中的 Order、Files 及 FilesMatch 命令实现的访问控制可以满足大部分要求,但是当用户被拒绝时,将会显示“403 Forbidden”。

此时可以考虑用rewrite实现相应的功能:
 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.+).css$
RewriteCond %{REQUEST_FILENAME} !^(.+).js$
RewriteCond %{REQUEST_FILENAME} !special.zip$
RewriteRule ^(.+)$ /chat/ [NC]

该规则将仅允许用户请求.css, .js类型的文件,还有special.zip文件。
RewriteRule 后面指定了限制规则:映射到/char/目录下处理。
RewriteCond 后面的“感叹号”(!)起到了“否定”作用,它表明,对不满足后面正则表达式者应用RewriteRule规则,也就是对当前类型的文件将不应用规则。
RewriteCond 之间是以逻辑“与”连接的,也就是只有当三个条件都不满足时才执行RewriteRule。
该规则也会限制访问.htm, .jpg等格式。
该规则不可以放在虚拟站点根目录(/)下,否则会死循环。
如果是二级目录,如/test/,那么传入RewriteCond的参数是以/test/开始的,因此从(.+)获得的文件名也含有/test/,读者必须对此多加小心。

要想仅获得文件名,可以将(.+)替换成([^/]+),并且去掉符号^,如下所示:
 

复制代码 代码示例:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !([^/]+).css$
RewriteCond %{REQUEST_FILENAME} !([^/]+).js$
RewriteRule ^(.+)$ /chat/ [NC]

2,用 .htaccess 阻止 User-agent

什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是所有HTTP客户端都得用User-agent向服务器“自报家门”,以便服务器对不同的客户端作出不同响应。比如,某站点可能需要对浏览器、搜索引擎crawl还有各类下载工具作出不同的响应。服务器就是通过所谓的User-agent进行区分的。

如果你的服务器提供某些资源的下载,那么你就必须多加小心诸如“迅雷”等下载软件,因为它们可能把网站资源吸干,并且影响正常访客访问。
为此,可以利用Rewrite限制某些UA的访问:
 

复制代码 代码示例:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC]
RewriteRule . abuse.txt [L]

该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt

HTTP_USER_AGENT是Apache的内置变量

2.0.50727是迅雷User-agent的特征字符串
RewriteRule后面的“点”表示“任意URI”,也就是不管请求的是什么,都输出abuse.txt
通常,不会仅限制一个UA。利用[OR]即可实现对多个UA作出统一处理:
 

复制代码 代码示例:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
# etc..
RewriteCond %{HTTP_USER_AGENT} ^Net Vampire [NC]
RewriteRule . abuse.txt [L]

3. 用.htaccess阻止盗链(hot-linking)
.htaccess的Rewrite功能可以提供非常简单、有效的方法阻止图片盗链。
 

复制代码 代码示例:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?nowamagic.net/ [NC]
RewriteCond %{REQUEST_URI} !hotlink.png [NC]
RewriteRule .*.(gif|jpg|png)$ /hotlink.png [NC]

说明:
除本站以外其他网站都不得引用本站图片,具体可以理解为:
如果引用站点为“空”或者是“本站”,或者,所引用对象是“hotlink.png”,那么就允许访问。
再次提醒,RewriteCond之间默认的逻辑连接词是逻辑“与”。难点在于理解逻辑转换,即德·摩根定律。