Apache虚拟主机对网站目录或特定文件进行访问控制的小结

这个问题的学习起因于前几天一个叫Mike的马来西亚的ip连续几天往我的博客里灌垃圾评论。一天大概10条,每条大概5屏那么多内容。我用的Akismet反垃圾评论插件还是需要人工核实一下看错杀没有,而且,几乎一半的垃圾评论都会漏掉。我的博客垃圾评论不多,一天就20条左右。一般的短的垃圾评论一分钟就处理了。可那个Mike的垃圾评论太长了。于是,我只好封了他的ip了。几天过去了,再没见他的垃圾评论了。下面说一下我在这个问题上的一些心得小结。

我用的虚拟主机是盘古的linux+cpanel主机,在cpanel控制面板有一个功能叫“IP Deny Manager”,在里面把你要禁止访问你的网站的ip加进去就行了。如果要封一个IP段,把IP段的开始部分填上。如封1.2.3.*这个IP段的所有IP,就填1.2.3.。如果要封来自一个网站的访问,就填上这个网站的域名,系统自动把域名解析成IP再填进禁止列表。如果不作进一步的深研,你要禁止一个IP也就到此为止了。但是我还朝前走了几步。

那么cpanel控制面板是怎么实现对IP的禁止的呢?答案是它把配置信息添加进了网站根目录的.htaccess文件中。假如我禁止了两个IP,1.2.3.4,1.2.3.5,那么cpanel在.htaccess文件的最后添加了下面一段内容:

<Files 403.shtml>
order allow,deny
allow from all
</Files>

deny from 1.2.3.4
deny from 1.2.3.5

相应基础知识请查看我的网摘在apache下实现网站目录的访问控制(links for 2007-10-07)。这里要特别提一下<Files>片断的意思,上面这个片断的意思是允许任何人(包括后面被禁止了的IP)都可以访问403.shtml这个403出错文件。这个403.shtml你可以在cpanel的相应功能中编辑,可以返回给被禁止IP的用户。我的内容是:

Sorry, your IP is forbidden. If you aren't a spams spreader, please contact me with this email: mdx-xx#tom.com(change # to @ for email). Thanks.

被我误禁止IP的朋友可以用其中的邮件和我联系。

另外,同理,如果你想对特定文件名的文件进行访问控制,如禁止IP 1.2.3.4 访问文件test.html,可以再在前面的<Files>...</Files>加上一个片断如下:

<Files test.html>
order allow,deny
allow from all
deny from 1.2.3.4
</Files>

意思是除了IP 1.2.3.4 外,所有人都可以访问系统中名为test.html的文件,片断中间的order指明allow和deny起作用的顺序,如上面,因为“order allow,deny”中deny在allow后面,所以deny就会排除掉allow中允许的IP 1.2.3.4 了。详情见上提的网摘。这里还要特别注意的是,写在这个根目录.htaccess的文件名的设置会对各级目录中相同的文件起作用!例如,在根目录下有个子目录中包含了名为test.html的文件,那么这个文件同样是除了IP 1.2.3.4 不能访问外其余人都可以访问。

写在子目录中的.htaccess文件中的访问控制配置以此类推。

实际上,cpanel的一些配置管理就是通过操作根目录下的.htaccess文件进行的。如:转向设置。所以,如果你同时用手工在对这个文件进行操作的话,在cpanel的操作结束后,最好检查一下你的这个文件。以防止冲突。

Apache的配置功能非常灵活和强大,上面的这点知识只是一点皮毛。

下面是两点存疑:
1、我在上面网摘中的文章中看到可以把域名直接写在.htaccess文件中,从而禁止对应域名的IP。但是我试了一下,手工把域名加进禁止列表如“deny from adomain.com”,并不能实现对这个域名所在IP的禁止。我是通过一个代理服务网站来做测试的。不知道这个是什么原因?是cpanel的虚拟主机对这个直接写域名的方式不允许吗?

2、如何在顶级目录的.htaccess中实现对特定目录的访问控制?如实现对/test/subdir目录的访问控制?我知道可以在/test/subdir目录放一个.htaccess文件的实现方法,但是在根目录下的.htaccess文件中怎么实现呢?我也知道一个叫<Directory>的片断应该可以实现这个的,但是没有进一步去学习了,存疑于此。

如果我的日记中有什么错漏的话,请朋友提示一下。谢谢。