我正在尝试通过 Apache 公开一个位置。通常,我的虚拟主机中有这个块,内容是
<Location />
AuthType Basic
AuthUserFile /web/.htpasswd
AuthName "Test Site"
Require valid-user
</Location>
这很好用 - 提供的所有服务都需要有效用户。现在我想公开一个不需要身份验证的服务,所以我正在寻找一种方法来让除 /services 之外的所有位置都需要身份验证。我一直在使用 LocationMatch,但我并不完全清楚它在做什么。
<LocationMatch ^/(?!services)[^.]*$>
AuthType Basic
...
</LocationMatch>
允许 /services 及其下的所有内容跳过 LocationMatch,但它有允许 example.com/.somefile 绕过 LocationMatch 块的副作用。
此外,当我尝试
<LocationMatch ^/(?!services)>
AuthType Basic
...
</LocationMatch>
所有内容(包括/services)都与 LocationMatch 匹配。
如果有人能告诉我 [^.]* 类做了什么而第二个测试没有做,以及如何仅公开 /services 同时保持所有其他路径处于身份验证之下,我将不胜感激。
答案1
本页由 Antonio Lorusso 提供建议执行以下操作将文件夹从 apache 身份验证中排除:
<Location "/">
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/www/clients/client12/web17/passwd
AuthGroupFile /dev/null
Require valid-user
SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow
SetEnvIf Request_URI "^/favicon.ico$" allow
Order allow,deny
Allow from env=allow
Satisfy Any
</Location>
在这种情况下,以 /admin、/skin、/js 或 /index 开头的 URL 将被 auth 忽略。
本节对您来说关键的部分是:
SetEnvIf Request_URI "^/(admin|skin|js|index)(.*)$" allow
在你的情况下适当的代码将是:
SetEnvIf Request_URI "^/services(.*)$" allow
_
答案2
嗯,[^.]
意思是“不是.
”,这就是为什么/.somefile
不匹配。最后一个示例不起作用的一个可能原因是,只有从 Apache 2.0 开始才支持与 Perl 兼容的正则表达式,因此如果您使用的是 Apache 1.3(您确实应该在问题中指定 Apache 版本),那就只能这样了。
答案3
维护
<Location />
AuthType Basic
AuthUserFile /web/.htpasswd
AuthName "Test Site"
Require valid-user
</Location>
并添加这个新位置
<Location /services>
Satisfy any
Order deny,allow
</Location>
答案4
尝试了很多方法都没有成功。
最后这个在 apache 2.2 上成功了。
- 两条路径未经授权,其他路径未经授权
- 我添加了从 / 到 /ui 的重写,以便实现
以下是 LocationMatch 指令的使用方法
<LocationMatch /(firstpath|secondpath).*>
AuthType Basic
AuthName "Restricted AREA "
AuthUserFile /etc/apache2/security/password
AuthGroupFile /etc/apache2/security/group
Require group admin
Order allow,deny
Allow from 127.0.0.1
Allow from 10.0.0.0/24
Allow from env=allowclient
Satisfy any
</LocationMatch>