我使用apache的基本httpauthentication来控制访问,但是,我只想控制一个目录访问级别,也就是说,我只希望目录a被authentication,但不是a的子(例如a / b),这是可能的?
<位置/ a /> 选项 - 索引 拒绝订单,允许 全部允许 AuthType基本 AuthName“仅限会员” AuthUserFile /home/xxxx/.htpasswd 要求有效的用户 </位置>
AFAIK这是不可能的。 我刚刚在httpd.conf和一个.htaccess文件中试过,并且不起作用。
这是因为一般来说,这种设置没有任何意义 – 要求对目录进行身份validation的关键是保护您的站点的一个区域,受保护的目录的子目录将被视为该受保护区域的一部分。
HTTP基本身份validation的范围是按域的 – 如果您需要对子目录进行身份validation,那么相同的凭据将在后续请求中发送到更高级别的目录。 这意味着他们也将被发送到一个较低级目录的所有请求。
在服务器端脚本(比如PHP)中使用一些自定义逻辑来实现这一点是可能的,但更好的解决scheme是重新考虑你的目录结构。 应该没有理由要求对更高级目录进行身份validation,而不要求更低级目录的身份validation – 您需要将低级目录中的内容移动到站点的开放访问区域,并且密码保护区域只应包含内容这应该是私人的。
作为一个方面说明 – 基于HTTP的HTTP基本身份validation是如此不安全, 几乎没有使用它 – 如果你有一些你真正关心保护的内容,可以考虑使用摘要身份validation。 您可以使用HTTPS来防止泄露基本身份validation凭证,并且如果您使用的是HTTPS,则还可以使用客户端证书身份validation来获得最佳的可用安全性。
请注意,我没有尝试过这一点,我不是一个Apache大师,但假设DaveRandom是正确的,我的下一个尝试将是在/ A /目录中使用.htaccess文件,然后使用URL重写指向/ A /孩子,其逻辑是/ A /孩子永远不会导致目录遍历到/ A /来读取.htaccess文件,因为目录解释发生在后面的过程中。
当然,如果这样做,这可能是一个错误,将被修复。