在使用Apache的虚拟主机configuration中获取Order指令时遇到了一些麻烦。
我有一些IP地址,我想完全拒绝访问整个虚拟主机。 这些以前被标记为恶意。
除了我们的内部IP范围之外,我还想拒绝除GET和HEAD之外的所有请求。
我在第一个Directory指令中遇到了问题,并想出如何使用Order指令进行排列。
这是我到目前为止,它似乎没有工作,所以我想得到一些build议,如何最好的命令这个块…
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.test.com ServerAlias test.com DocumentRoot /var/www/html/www.test.com <Directory /var/www/html/www.test.com> Options +FollowSymLinks Order Deny,Allow # Deny suspect IPs previously flagged Deny from 111.111.111.111 Deny from 222.222.222.222 Deny from 333.333.333.333 # But only internal IPs can POST <LimitExcept GET HEAD> Deny from all Allow from 10.10.0.0/22 </LimitExcept> Allow from all </Directory> # CLI directory not web accessible <Directory /var/www/html/www.test.com/cli> Order Deny,Allow Deny from all </Directory> # Restrict access to admin internal IPs only <Directory /var/www/html/www.test.com/admin> Order Deny,Allow Deny from all Allow from 10.10.0.0/22 </Directory> </VirtualHost>
我的头如此混乱,以至于我无法清楚地看到它。 有人知道怎么做吗?
我可以为同一个目录使用多个Directory指令吗?
所以我把拒绝所有请求除了GET和HEAD之外否认恶意IP?
当您使用Order Deny,Allow Allow from all将覆盖Deny from ...任何Deny from ... 。
Order Deny,Allow的默认行为Order Deny,Allow在不匹配的情况下是“允许”。 如果您删除“ Allow from all ”,它是否更接近预期?
每个<Directory>也inheritance祖先(即较短的path) <Directory>设置,所以<LimitExcept>也适用于其他的<Directory>部分。 你不能简单地通过添加撤消
<Limit GET HEAD> Allow from all </Limit>
对那些,因为这将撤消你的IP地址坏IP地址的阻止。 (我不知道你是否需要在你的网站上撤消它。)
订单/允许/拒绝的重要事项是:
Allow和Deny都检查任何匹配 Allow或Deny )和什么默认都取决于Order 。 有重复的<Directory ...>块是不是一个好主意,但是如果你这样做,他们按照它们出现在configuration中的顺序进行处理。
查看完整逻辑的Apache文档: http : //httpd.apache.org/docs/2.2/sections.html
由于您的要求不太适合简单的允许/拒绝的逻辑,你应该看看使用以下两个或两个:
SetEnvIf和Allow from env=... Deny from env=... mod_rewrite 这是做到这一点的一种方式:
RewriteEngine on RewriteCond %{REMOTE_ADDR} 1.1.1.1 [OR] RewriteCond %{REMOTE_ADDR} 2.2.2.2 [OR] RewriteCond %{REMOTE_ADDR} 3.3.3.3 RewriteRule . - [F]
把它放在你的<Virtualhost>外部和</Directory>容器中。 如果IP列表很大或者很不稳定,你也可以使用RewriteMap和上面的一个变种,把IP保存在一个单独的文件中作为一个更可扩展的解决scheme。