Apache2.4:AuthType Basic和REQUEST_URI-比较(带或不带正则表达式)无法正常工作

Apache2.4:AuthType Basic和REQUEST_URI-比较(带或不带正则表达式)无法正常工作,apache,authentication,apache2.4,request-uri,Apache,Authentication,Apache2.4,Request Uri,我们在Debian服务器上使用Apache2.4.10。请求从充当平衡器的Apache代理服务器(相同的系统和版本)重定向(目前只有一个平衡成员) 通常通过AuthType Basic限制对相关单个虚拟主机的访问。只有一个包含公共文档的文件夹不需要身份验证就可以访问 我测试了多种方法(新的Apache2.4语法)来实现这一点——但不管我尝试了哪种方法,我总是遇到同一个问题:与请求URI的任何比较都不能像预期的那样工作——无论是否使用正则表达式。在进行比较时,似乎请求URI的值无效 我尝试了以下替

我们在Debian服务器上使用Apache2.4.10。请求从充当平衡器的Apache代理服务器(相同的系统和版本)重定向(目前只有一个平衡成员)

通常通过AuthType Basic限制对相关单个虚拟主机的访问。只有一个包含公共文档的文件夹不需要身份验证就可以访问

我测试了多种方法(新的Apache2.4语法)来实现这一点——但不管我尝试了哪种方法,我总是遇到同一个问题:与请求URI的任何比较都不能像预期的那样工作——无论是否使用正则表达式。在进行比较时,似乎请求URI的值无效

我尝试了以下替代方案:

(A)

(作为测试)然后它工作(在没有凭据的情况下授予访问权限)

当我将
[a-z]
更改为例如
[d-i]
时,它仍然工作,但当我将
[a-z]
更改为例如
[d-g]
时,它不再工作,并显示用户/通行证对话框

当我相应地更改示例B中LocationMatch指令中的正则表达式时,会出现完全相同的行为

另一个提示:


使用
而不是
而不是使用位置,您可以使用另一个目录

<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>

ServerName.domain.name
DocumentRoot/var/www/domain.name
DirectoryIndex.php
AuthType Basic
AuthName“受限”
AuthBasicProvider文件
AuthUserFile/path/to/user/file
需要方法选项
需要有效用户
选项+ExecCGI+FollowSymLinks
允许超越所有
**
AuthType无
要求所有授权
**
CustomLog“/var/log/apache2/test_log”“%t请求URI:%{REQUEST_URI}e”

通过使用.htaccess也可以实现这一点。一个相关的问题在

中得到了回答,我终于自己找到了解决办法。我使用版本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>

ServerName.domain.name
DocumentRoot/var/www/domain.name
DirectoryIndex.php
AuthType Basic
AuthName“受限”
AuthBasicProvider文件
AuthUserFile/path/to/user/file
需要方法选项
需要expr%{u请求}=~m\GET\s+\/docs\/[^\/]+\s+HTTP#
需要有效用户
选项+ExecCGI+FollowSymLinks
允许超越所有

Logging%{REQUEST\u URI}有误导性,它不是从表达式中的%{REQUEST\u URI}的同一源读取的。前者要求httpd能够将数据复制到环境变量中。我今天稍后会看一看,但是mod_log_debug会更有帮助。它将表达式作为其值参数,并可以显示不同阶段的值。也许某个模块正在更改r->uri,这将给出一个提示。好的,我将同时检查mod_log\u debug…mod_log\u debug不会向任何日志输出任何内容。在不同的位置测试-没有成功。我知道。我也试过通过目录。但它不起作用——至少在没有.htaccess文件的情况下是这样(在本例中我不想使用该文件)。但也许我应该再试一次。但这只是一个变通办法,并不能解决问题。我想问题在某种程度上与mod_重写有关。。在匹配发生时,请求URI似乎已更改。
<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>
Require expr %{REQUEST_URI} =~ m#^/[a-z]#
<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>
<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>