在研究完文档之后,我不希望在<Directory>容器中的指令影响以下(完整)configuration中的/server-status类的非文件系统URL:
DefaultRuntimeDir /var/run/apache2 PidFile /var/run/apache2/apache2.pid User www-data Group www-data ErrorLog /var/log/apache2/error.log LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined DocumentRoot /var/www/html Listen 80 LoadModule mpm_worker_module /usr/lib/apache2/modules/mod_mpm_worker.so LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so LoadModule status_module /usr/lib/apache2/modules/mod_status.so <Location /server-status> SetHandler server-status </Location> <Directory /> Require all denied </Directory>
不过,如果我在Debian上运行Apache / 2.4.25这个configuration就好了
# apache2 -f demo.conf -X
我明白了
$ curl --head http://localhost/server-status HTTP/1.1 403 Forbidden
而如果我更换denied在上述configuration与granted ,我得到
curl --head http://localhost/server-status HTTP/1.1 200 OK
换句话说, <Directory />块中的Require指令确实会影响这个URL的可达性。 文档的哪一部分解释了这一点?
您只设置一个访问控制 :
<Directory /> Require all denied </Directory>
关于指令合并的部分解释了Directory部分首先被应用,在Location部分的指令之前,不pipe他们是如何在你的httpd.conf中被sorting的。
您随后看到的行为在AuthMerging指令中解释:
当启用授权时,通常由每个后续configuration部分inheritance , 除非指定了一组不同的授权指令。 这是默认的动作…
您不要在<Location /server-status>configuration部分中设置任何其他访问控制,以覆盖您设置的唯一访问控制, Require all denied ,这是由mod-status模块inheritance的访问控制在/服务器状态的webspace。
就像@ ezra-s强调IRC一样,即使对于纯粹的虚拟URI(例如问题中的示例configuration中的/server-status ),Apache也会尝试将主要部分(在本例中为/ )与文件系统匹配。 对于绝对URI,前导/将始终与DocumentRoot匹配,但是进一步的path组件也可以匹配,如果它们碰巧存在于DocumentRoot下。 我们可以用下面的代码replaceconfiguration中的<Location /server-status>和<Directory />部分来演示这个:
<Location /foo/server-status> SetHandler server-status </Location> <Location /bar/server-status> SetHandler server-status </Location> <Directory /> Require all denied </Directory> # The /var/www/html/foo directory exists, this makes /foo/server-status accessible: <Directory /var/www/html/foo> Require all granted </Directory> # The /var/www/html/bar directory does not exist, this does not make /bar/server-status accessible: <Directory /var/www/html/bar> Require all granted </Directory> # But this helps regardless (through another means): <Location /bar> Require all granted </Location>
这就是虚拟位置如何受到<Directory>块的影响。