影响<Location / server-status>的Apache <Directory />设置

在研究完文档之后,我不希望在<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>块的影响。