最早接触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错误是密码输入错误,可我明明是绝对禁止访问的设置嘛,而且如果用浏览器访问,并且输入正确的密码居然还是可以访问呢,哪里的设置出了问题?虽然一样都是无法访问,可问题一定要搞清楚才行。
其实,仔细看看[Satisfy的官方文档](http://httpd.apache.org/docs/2.2/mod/core.html#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拒绝访问了。
PS: 记得以前<Files (fileA|fileB)>
是可以用的,现在不起作用了,要改成正则才行:<Files ~ (fileA|fileB)>
。
还有就是如果用FireFox浏览这个Blog正常显示 如果用IE看,右边的栏目掉到 Leave a Reply下边去了,是IE的问题?
7月22日 9:22AM
以前内容中有长图片的时候会这样,现在又出现了? css的问题,大概是代码块给顶出去了,建议使用firefox啦~ IE那个破东西不用也罢
@Fwolf 回答你的问题哈:MT (gs)在过去的一段时间里速度不是很稳定。这就是我说的恶心的地方,相比而言,hostgator就很好。最差的应该是ixwebhosting。综合最近200天内的表现。
@Caine 谢谢,MT的确在速度上并不突出,稳定性由于时间太短还不敢下结论 不过WP装上cache插件之后我感觉还是可以接受的 谢谢你提供的信息 🙂