我读这个答案回答了前段时间提出的一个类似问题,它很有道理,并且与 Apache 2.4 文档相符。但我有以下经历,这似乎与该答案和文档相矛盾。考虑以下指令:
<Directory "/opt/lampp/htdocs/foo">
AuthName "foo user"
AuthType Basic
Authuserfile /opt/lampp/passwds/foo.users
</Directory>
<VirtualHost *:80>
ServerName foo.example.com
DocumentRoot "/opt/lampp/htdocs/foo/public"
ErrorLog "logs/foo.error_log"
<Location />
Require valid-user
</Location>
<Location /wp/feed>
Require all granted
</Location>
CustomLog "logs/foo.access_log" combined
</VirtualHost>
显然,其目的是使用 http 基本身份验证来保护所有 URL,除了对于下面的网址/wp/feed
。但重新加载 apache 后,我在转到 时会提示我输入凭据/wp/feed
。该网址与两个位置路径匹配,因此 apache 应该先处理,Require valid-user
然后处理Require all granted
,而我不应该被提示。只是为了“好玩”,我尝试切换位置块的顺序,但仍然会提示。我发现唯一能按预期工作的方法就是完全删除“/”的位置块。对我来说,这也是意料之外的行为,因为在这种情况下,根本没有任何Require valid-user
指令应该应用于不匹配的网址/wp/feed
。然而,它们却被应用了,因为我被提示输入所有不匹配的网址/wp/feed
。
有人能解释一下吗?我是不是没能理解答案?文档?
使用 nginx 指令指定此行为没有问题,其中最长前缀匹配通常获胜。如果我得到的确实是预期的行为,我该如何使用 apache 获得我想要的结果?