Apache关于Order Allow Deny的配置搞得我很混乱,总结一下吧:
<Directory "/var/www/html"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order deny,allow </Directory>
总则:
影响最终判断结果的只有两点:
1. order语句中allow、deny的先后顺序;
2. allow、deny语句中各自包含的范围。
提醒:
1. 修改完配置后要保存好并重启Apache服务,配置才能生效;
2. 开头字母不分大小写;
3. allow、deny语句不分先后顺序,谁先谁后不影响最终判断结果;但都会被判断到;
4. order语句中,“allow,deny”之间“有且只有”一个逗号(英文格式的),而且先后顺序很重要;
5. Apache有一条缺省规则,“order allow,deny”本身就默认了拒绝所有的意思,因为deny在allow的后面;同理,“order deny,allow”本身默认的是允许所有;当然,最终判断结果还要综合下面的allow、deny语句中各自所包含的范围;(也就是说order语句后面可以没有allow、deny语句)
6. allow、deny语句中,第二个单词一定是“from”,否则Apache会因错而无法启动,
7. “order allow,deny”代表先判断allow语句再判断deny语句,反之亦然。
上面说的都是要记住的,而下面说的是我独创的理解方法。如果有人看了而没有豁然开朗的感觉,那算是我的失败!
判断原则分4步走:
1. 首先判断默认的;
2. 然后判断逗号前的;
3. 最后判断逗号后的;
4. 最终按顺序叠加而得出判断结果。
上面三点我说的简单而形象,主要是为了便于记忆。暂时不理解不要紧,继续看下面详细的解说自然会明白。下面以一个普通例子来做解释:
order deny,allow
allow from 218.20.253.2
deny from 218.20
1. 所谓“首先判断默认的”,就是判断“order deny,allow”这句,它默认是允许所有;
2. 所谓“然后判断逗号前的”,因为在本例子中的order语句里面,deny在逗号的前面,所以现在轮到判断下面的deny语句了——“deny from 218.20”;
3. 所谓“最后判断逗号后的”,因为在本例子中的order语句里面,allow在逗号的后面,所以最后轮到判断下面的allow语句了——“allow from 218.20.253.2”。
4. 所谓“最终按顺序叠加而得出判断结果”,这是一个形象化了的说法,我把每一步判断都看作一个“不透明的图层”,然后一步步按顺序叠加上去,最终得出的“图像”就是判断结果。
用过作图软件的人应该都知道“图层”是怎么回事,我估计Apache关于order allow deny这方面的设计理念和photoshop等作图软件关于图层的设计理念是一样的。即“游戏规则”是一样的。
那么上面的例子就可以是这么一个步骤和图像——
1. 先画一个白色的大圆作为背景色,代表“order deny,allow”语句,默认意思是允许所有;
2. 然后在白色背景上面画一个小一点的黑色圆,代表“deny from 218.20”语句,意思是拒绝所有以218.20开头的IP,放进白色的大圆里面;
3. 最后再在这个黑色圆上面点一个白点,代表“allow from 218.20.253.2”语句,意思是允许218.20.253.2通过。
4. 到此为止,我们已经可以看到一个结果了,白色大圆上面有一个黑色圆,黑色圆上面还有一个白点。最后,我们所能看到的黑色部分就是拒绝通行的,剩下的白色部分都是允许通行的。判断的结果就是这么简单形象!
在这里再啰嗦一下,allow、deny语句后面跟的参数有多种形式,有不同的表达方式,我在网上看到的做法是deny from IP1 IP2 IP3或allow from domain.com等。其它的表达方式大家再找别的资料看吧。我想说的是另一种表达方式:
order deny,allow
allow from IP1 IP2
allow from domain.info
allow from 219.20.55.0/24
deny from all
我没具体验证过这是否对,不过这样是可以正常启动Apache服务的,按道理应该是正确的表达方式。哈哈,像我这样的入门者只能这样了,还希望大家多多指教!
下面是测试过的例子:
——————————–
Order deny,allow
allow from all
deny from 219.204.253.8
#全部都可以通行
——————————-
Order deny,allow
deny from 219.204.253.8
allow from all
#全部都可以通行
——————————-
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
具体分析一下:
1、由Order allow,deny得出是默认deny all,那么就是说,这个图的背景全部是黑色的;
2、先分析allow的规则,
allow from all,代表把黑色背景全部涂白;
3、再分析deny的规则,
deny from 219.204.253.8, 代表在全部涂白的背景上面点一个黑点;
好了,最终的规则就是:只有219.204.253.8不能通行
——————————-
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
——————————-
Order allow,deny
deny from all
allow from 219.204.253.8
#全部都不能通行
具体分析一下:
1、由Order allow,deny得出是默认deny all,那么就是说,这个图的背景全部是黑色的;
2、先分析allow的规则,
allow from 219.204.253.8,代表在黑色背景上面点一个白点;
3、再分析deny的规则,
deny from all, 代表所有全部涂黑,自然也覆盖了那个白点了;
好了,最终的规则就是:全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
deny from all
#全部都不能通行
——————————-
Order deny,allow
allow from 219.204.253.8
deny from all
#只允许219.204.253.8通行
——————————-
Order deny,allow
deny from all
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
——————————–
Order deny,allow
#全部都可以通行(默认的)
——————————-
Order allow,deny
#全部都不能通行(默认的)
——————————-
Order allow,deny
deny from all
#全部都不能通行
——————————-
Order deny,allow
deny from all
#全部都不能通行
——————————-
对于上面两种情况,如果换成allow from all,则全部都可以通行!
——————————-
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
Order allow,deny
deny from 219.204.253.8
#全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
Order deny,allow
allow from 219.204.253.8
#全部都可以通行
——————————-
——————————-
order deny,allow
allow from 218.20.253.2
deny from 218.20
#代表拒绝218.20开头的IP,但允许218.20.253.2通过;而其它非218开头的IP也都允许通过。
——————————-
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉换的order语句中的allow、deny先后顺序,但最终结果表示全部都拒绝!
具体分析一下:
1、由Order allow,deny得出是默认deny all,那么就是说,这个图的背景全部是黑色的;
2、先分析allow的规则,
allow from 218.20.253.2,代表在黑色背景上面点一个白点;
3、再分析deny的规则,
deny from 218.20, 代表涂黑所有218.20.*.*的ip,自然也把218.20.253.2给覆盖了,由于背景就是黑色的,所以都是黑色的了,最终结果表示全部都拒绝。