我的 /var/www/htdocs 中有以下目录:
test123/
test123/cache/
test456/
test456/cache/
test789/
test789/cache/
another_directory/cache/
我想实现这个目标:
- 每个人都可以访问
- 访问 /test123/test.htm + /test456/test.htm + /test789/test.htm,获取 IP 地址 192.168.1.10
- 无法访问所有缓存目录
因此我得到了以下 apache 2.4 配置,但它没有按预期工作,因为我仍然能够访问缓存目录 test123/cache、test456/cache 和 test789/cache。
<VirtualHost *:80>
DocumentRoot /var/www/htdocs
<Directory "/var/www/htdocs">
Options -Indexes +FollowSymLinks
AllowOverride None
</Directory>
<Directory ~ "/var/www/htdocs/test(123|456|789)">
Require ip 192.168.1.10
</Directory>
<Directory "/var/www/htdocs/*/cache">
Require all denied
</Directory>
</VirtualHost>
我做错了什么?谢谢你的帮助!:)
答案1
引号来自文档:
<Directory>
[...] 按照从最短目录组件到最长目录组件的顺序进行处理。例如,<Directory "/var/web/dir">
将在 之前进行处理<Directory "/var/web/dir/subdir">
。- 如果多个
<Directory>
部分适用于同一目录,则它们按照配置文件的顺序进行处理。
这会使你的案子变得有点困难。
从第二条语句中,我认为只需要切换两个<Directory>
指令的顺序:
<Directory "/var/www/htdocs/*/cache">
Require all denied
</Directory>
<Directory ~ "/var/www/htdocs/test(123|456|789)">
Require ip 192.168.1.10
</Directory>
如果第一个指令匹配,则被拒绝。否则第二个指令应该匹配。
但是,第一条语句指出最短的目录将首先处理。这里最短的目录将是<Directory ~ "/var/www/htdocs/test(123|456|789)">
。在这种情况下,顺序并不重要,您将不得不寻找其他解决方案。
我现在无法测试它,所以只需尝试切换这两个语句。