apache中satisfy用法详解

发布时间:2020-01-19编辑:脚本学堂
本文介绍了apache服务器中satisfy的用法,satisfy就是在同时启用了allow和require的情况下,指定相关策略的,一共有两个备选值,all表示用户必须同时满足allow和require的条件,而any则是满足其中之一即可。

satisfy用法

之前接触Satisfy,一个目录启用了密码保护,想单独开放它的一个子目录,让这个子目录无须密码即可访问,按如下设置:
 

复制代码 代码示例:
<Directory "dir1">
    AllowOverride All
    AuthName "Fwolf's Vault"
    AuthType Basic
    AuthUserFile path/to/pwd/file
    require valid-user
</Directory>
<Directory "dir1/dir2">
    Allow from all
    Satisfy any
</Directory>

这样用户访问dir2的时候就不需要输入密码了。
另外,dir1和dir2都是针对文件地址的,而非url。

环境和上面的一样,只是在dir2下面,想禁止对一个文件的访问,于是dir2的设置变为:
 

复制代码 代码示例:
<Directory "dir1/dir2">
    Allow from all
    Satisfy any
    <Files secret_file>
        order allow,deny
        deny from all
    </Files>
</Directory>

(deny from all换成allow from someip,即绝对禁止换成只允许指定IP地址,对我后面的描述没有影响)

现在访问那个应该被禁止访问的文件secret_file,由于本身不在允许ip范围之内,所以应该是不能访问的,可是怎么弹出对话框让输入用户名和密码了?
如果用wget访问的话,可以清楚的看到:
401 Authorization Required
Authorization failed.
等,401错误是密码输入错误,可明明是绝对禁止访问的设置嘛,而且如果用浏览器访问,并且输入正确的密码居然还是可以访问呢,哪里的设置出了问题?
虽然一样都是无法访问,可问题一定要搞清楚才行。(www.jb200.com 脚本学堂)

其实,仔细看看Satisfy的官方文档,答案就在其中,Satisfy就是在同时启用了Allow和Require的情况下,指定相关策略的,一共有两个备选值,All表示用户必须同时满足Allow和Require的条件,而Any则是满足其中之一即可。

应用到我的问题上来,从上向下看,因为设置是从上级向下逐步解析的,最下层目录的配置具有最高的优先级,可以覆盖上级目录的设置,在.htaccess里也是一样。

dir1中设置密码验证启用了Require;然后下级的dir2启用了Allow,并且用Satisfy any指定用户只要ip符合all或者输入正确密码就能访问,由于ip肯定会符合all这个条件,所以等同于取消了密码限制;最后的secret_file,把Allow进行了限制,注意,这时用户的ip不符合Allow,按照Satisfy any的定义,服务器自然会去查是否符合两个条件中的另外一个是否能够通过,所以就出现了密码输入框,而不是直接403 Forbidden。

只要在secret_file的配置中增加一句:
Satisfy All

覆盖掉dir2中的Satisfy any设置,就可以实现预期的403拒绝访问了。

备注:
记得以前<Files (fileA|fileB)>是可以用的,现在不起作用了,要改成正则才行:<Files ~ (fileA|fileB)>。