Apache 2.4:AuthType Basic 和 REQUEST_URI - 比较(有或没有正则表达式)不能正常工作
Posted
技术标签:
【中文标题】Apache 2.4:AuthType Basic 和 REQUEST_URI - 比较(有或没有正则表达式)不能正常工作【英文标题】:Apache 2.4: AuthType Basic and REQUEST_URI - Comparisons (with or without regular expr.) do not work properly 【发布时间】:2017-06-18 05:15:28 【问题描述】:我们在 Debian 服务器上使用 Apache 2.4.10。请求从充当平衡器(目前只有一个平衡器成员)的 Apache 代理服务器(相同系统和版本)重定向。
对相关单个虚拟主机的访问通常通过 AuthType Basic 进行限制。只有一个包含公共文档的文件夹无需身份验证即可访问。
我测试了多种方法(新的 apache 2.4 语法)来实现这一点 - 但无论我尝试了哪种方法,我总是遇到同一个问题:与 REQUEST_URI 的任何比较都无法按预期工作 - 有或没有常规表达。似乎 REQUEST_URI 在进行比较时具有无效值。
我试过 i.a.以下替代方案:
一)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require expr %REQUEST_URI =~ m#^/docs#
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%REQUEST_URIe"
</VirtualHost>
B)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
<LocationMatch "^/docs">
AuthType None
Require all granted
</LocationMatch>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%REQUEST_URIe"
</VirtualHost>
C)
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
SetEnvIf Request_URI /docs noAuth=1
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require env noauth
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%REQUEST_URIe"
</VirtualHost>
每个替代方案似乎都停留在同一个问题上。与 REQUEST_URI 的比较失败或无法正常工作。
示例:当我将示例 A 中的第 16 行更改为
Require expr %REQUEST_URI =~ m#^/[a-z]#
(作为测试)然后它可以工作(在没有凭据的情况下授予访问权限)。
当我将 [a-z]
更改为例如[d-i]
,它仍然有效,但是当我将 [a-z]
更改为例如[d-g]
,它不再起作用并出现用户/通行证对话框。
当我相应地更改示例 B 中 LocationMatch 指令中的正则表达式时,会出现完全相同的行为。
另一个提示:
使用<Location /docs>
代替<LocationMatch...
(参见示例B)也不起作用。但是<Location />
有效。
还有:
日志输出总是相同的:
当在没有凭据的情况下授予访问权限时,REQUEST_URI 的值与所请求 URL 的路径部分相同(例如 /docs)。
但是当用户/密码对话出现时,该值是一个破折号(“-”),这似乎是 apache 用于空值或不可用值的默认值。
还有:
即使我直接访问服务器(没有代理)或使用例如wget 向服务器上的 localhost 发出请求。
有没有人知道这里发生了什么!?...
【问题讨论】:
记录 %REQUEST_URIe 具有误导性,它不是从与表达式中的 %REQUEST_URI 相同的来源读取的。前者要求 httpd 已经足够远,可以将数据复制到环境变量中。 今天晚些时候我会看看,但 mod_log_debug 会更有帮助。它将表达式作为其值参数,并可以显示不同阶段的值。也许某些模块正在更改 r->uri,这将给出提示。 好的,我会同时检查 mod_log_debug... mod_log_debug 不会向任何日志输出任何内容。在不同的位置进行了测试 - 没有成功。 【参考方案1】:我终于自己找到了解决方法。我使用版本 A) - 但使用环境变量 THE_REQUEST
而不是 REQUEST_URI
。幸运的是它有效!
A) 的调整版本 - 仅适用于 GET 请求:
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require expr %THE_REQUEST =~ m#GET\s+\/docs\/[^\/]+\s+HTTP#
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
【讨论】:
我猜这个问题与 mod_rewrite 有某种关系。在匹配发生时,REQUEST_URI 似乎已经改变了。【参考方案2】:您可以使用另一个目录,而不是使用位置。
<VirtualHost *:80>
ServerName domain.name
DocumentRoot /var/www/domain.name
DirectoryIndex index.php
<Directory "/var/www/domain.name/">
AuthType Basic
AuthName "Restricted"
AuthBasicProvider file
AuthUserFile /path/to/user/file
<RequireAny>
Require method OPTIONS
Require valid-user
</RequireAny>
Options +ExecCGI +FollowSymLinks
AllowOverride All
</Directory>
**<Directory "/var/www/domain.name/docs/">
AuthType None
Require all granted
</Directory>**
CustomLog "/var/log/apache2/test_log" "%t REQUEST_URI:%REQUEST_URIe"
</VirtualHost>
同样可以通过使用 .htaccess 来完成。相关问题已在How to remove .htaccess password protection from a subdirectory中得到解答
【讨论】:
我知道。我也通过目录尝试过。但它不起作用 - 至少没有 .htaccess 文件(我不想在这种情况下使用)。但也许我应该再试一次。但这只是一种变通方法,并不能解决问题。以上是关于Apache 2.4:AuthType Basic 和 REQUEST_URI - 比较(有或没有正则表达式)不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章
关于Apache报错 couldn't perform authentication. AuthType not set!
apache2.2版本 configuration error: couldn't perform authentication. AuthType not set!: /
apache2.2.22 configuration error: couldn't perform authentication. AuthType not set!: /