我们在Debian服务器上使用Apache 2.4.10。请求从作为平衡器的Apache代理服务器(相同的系统和版本)重定向(此时只有一个余额成员)。
通常通过AuthType Basic限制对相关单个虚拟主机的访问。只需一个包含公共文档的文件夹,无需身份验证即可访问。
我测试了多种方法(新的apache 2.4语法)来实现这一点 - 但无论如何,我尝试了哪种方法,我总是坚持同样的问题:任何与REQUEST_URI的比较都无法按预期工作 - 有或没有常规表达。似乎REQUEST_URI在进行比较时的值无效。
我试过i.a.以下备选方案:
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_URI}e"
</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_URI}e"
</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_URI}e"
</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发出请求。
有没有人知道这里有什么想法!?...
答案 0 :(得分: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>
答案 1 :(得分:0)
您可以使用其他目录,而不是使用位置。
<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_URI}e"
</VirtualHost>
通过使用.htaccess可以实现同样的目的。相关问题已在How to remove .htaccess password protection from a subdirectory
中得到解答