阿帕奇设置影响

阿帕奇设置影响

在研究了文档我不希望<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>

相关内容