在研究了文档我不希望<Directory>
容器中的指令影响非文件系统 URL,就像/server-status
下面的(完整)配置一样:
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,并按照以下配置进行操作
# apache2 -f demo.conf -X
我明白了
$ curl --head http://localhost/server-status
HTTP/1.1 403 Forbidden
而如果我将denied
上面的配置替换为granted
,我会得到
curl --head http://localhost/server-status
HTTP/1.1 200 OK
换句话说,块Require
中的指令<Directory />
确实会影响此 URL 的可达性。文档的哪一部分解释了这一点?
答案1
您仅设置单一访问控制:
<Directory />
Require all denied
</Directory>
关于指令合并解释说,无论部分在您的 httpd.conf 中的顺序如何,Directory
部分都会首先应用,然后才是部分中的指令。Location
您随后看到的行为在AuthMerging
指示:
启用授权后,通常由每个后续配置部分继承,除非指定了一组不同的授权指令。这是默认操作...
您不需要在<Location /server-status>
配置部分中设置任何额外的访问控制,这些访问控制将覆盖您设置的唯一访问控制,即Require all denied
/server-status 网络空间中的 mod-status 模块继承的访问控制。
答案2
正如 @ezra-s 在 IRC 上强调的那样,即使对于纯虚拟 URI(如/server-status
问题中的示例配置),Apache 也会尝试将前导部分(/
在本例中)与文件系统进行匹配。对于绝对 URI,前导部分/
将始终与 匹配DocumentRoot
,但如果其他路径组件恰好存在于 下,则它们也可能匹配DocumentRoot
。我们可以用以下内容替换问题中配置的<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>
。