我有一个托管多个域及其子域的服务器,我正在尝试使用.htaccess找到保护某些敏感文件夹和子域的正确方法。现在一切都很好,但我想到了一个非常可行的解决方案(编程方面),但我似乎无法得到.htaccess来做我的恶行竞标。
长话短说:
/home/ip.allow
Allow
个条目(Allow from 123.123.123.123
)在我在此服务器上托管的域/子域中,我有简单的.htaccess文件,其中包含以下内容:
RewriteEngine On
Order allow, deny
Deny from all
我感兴趣的是如何包含/home/ip.allow
所以我不必以编程方式查找和编辑vhosts路径中的所有.htaccess文件(仅在一个文件中包含所有条件)会让我的生活变得如此简单。)
我确实在Apache's mod_rewrite documentation中找到了RewriteMap
指令,但这似乎只适用于重写,而不适用于授予访问权限。
有关此主题的任何想法?
答案 0 :(得分:3)
你可以使用mod_rewrite做类似的事情。但是你需要改变一些事情。
您需要创建一个键/值映射,而不是让包含大量条目的文件看起来像这样:Allow from 123.123.123.123
,我们可以将其传递给RewriteMap。在此示例中,由于您列出了一组允许访问的IP,因此该文件将包含一堆如下所示的条目:123.123.123.123 allow
,其中“123.123.123.123”是密钥,“允许” “是价值。
现在我们必须使用RewriteMap
为此设置一个映射,但是,我们只能在服务器配置或虚拟主机配置中使用它,而不是在Directory
内, Files
或.htaccess文件。因此,您可以在httpd.conf或虚拟主机文件中的某处设置它:
RewriteMap access_list txt:/home/ip.allow
现在,您可以使用访问此地图的RewriteCond和access_list
来访问任何.htaccess文件中的地图RewriteRule
,[F]
除了发出RewriteCond ${access_list:%{REMOTE_ADDR}} =""
RewriteRule ^(.*)$ - [F,L]
之外什么都不做(禁止):
RewriteCond
这里的%{REMOTE_ADDR}
只是试图找到123.123.123.123 allow
作为地图文件的关键字。如果地图文件中唯一的东西是127.0.0.1
且远程地址是=""
,则没有任何内容匹配,地图将返回一个空字符串,从而实现123.123.123.123
位。否则,如果远程地址为{{1}},则返回“允许”,条件将失败,从而授予访问权限。
根据您设置地图文件的方式,您可以使用授予或拒绝。