在Apache 2.4中,如何将IP地址和用户身份验证限制结合起来应用于子文件夹?

4

我希望限制对完整网站(Apache 2.4)的访问仅限于某些IP地址。除此之外,我还想通过用户身份验证限制对某些子文件夹的访问。但是,用户身份验证无法正常工作。以下是我的配置:

在虚拟主机配置中,我有以下设置:

<Location />
    # Localhost
    Require ip 127.0.0.1i
    # some other IP
    Require ip 1.2.3.4
<Location>

现在我想让子文件夹/secure/要求有效的用户登录。 /secure/.htaccess 的外观如下:
<RequireAll>
    Require all granted
    Require user user1 user2 user3
    AuthBasicProvider file
    AuthType Basic
    AuthName "Secure Folder Login"
    AuthUserFile /securePath/userAuth
</RequireAll>

我仍然可以在没有用户身份验证的情况下从IP 1.2.3.4访问/secure。感觉Apache会匹配IP Require ip 1.2.3.4指令(在隐式RequireAny内部),并且不会关心可能存在的进一步限制。


这里有一个部分解决方案 - 如果你的服务器启用了mod_access_compat,你可以使用旧的Apache语法使它按预期工作。链接中的代码有IfModule检查,因此当模块不存在时,它将恢复到较新的语法和忽略身份验证的行为。不幸的是,我还没有找到最终的答案。 - Shikkediel
3个回答

3
如果您希望阻止任何IP,但只允许列表中的IP,并为允许的IP提供基本的登录提示,则可以执行以下操作(在您的.htaccess文件中):
Require all denied
<RequireAll>
    Require valid-user
    Require ip 100.04.04.04
    AuthBasicProvider file
    AuthType Basic
    AuthName "Secure Folder Login"
    AuthUserFile /htdocs/www/web_projects/.htpasswd
</RequireAll>

对于多个IP地址,可以使用以下类似的方法:

Require all denied    
<RequireAll>
    <RequireAny>
        Require ip 78.53.160.0/19
        Require ip 80.171.1.0/24
        Require ip 80.171.2.0/23
        Require ip 80.171.4.0/22
        Require ip 80.171.8.0/21
        Require ip 80.171.16.0/20
        Require ip 80.171.32.0/19
        Require ip 80.171.64.0/18
    </RequireAny>
    <RequireAll>
        Require valid-user
        AuthBasicProvider file
        AuthType Basic
        AuthName "Secure Folder Login"
        AuthUserFile /htdocs/www/web_projects/.htpasswd
    </RequireAll>
</RequireAll>

由于某种原因,当IP匹配时,它也会忽略身份验证。 - Shikkediel

0

只将Require指令放在RequireAllRequireAny块内。 此外,不要使用Location块来处理文件系统对象(实际目录),请改用Directory

<Directory /opt/secure>
    Require all denied
    AuthBasicProvider file
    AuthType Basic
    AuthName "Secure Folder Login"
    AuthUserFile /opt/.htaccess
    <RequireAll>
        Require user1 user2 # or Require valid user
        <RequireAny>
            Require ip 78.53.160.0/19
            Require ip 80.171.1.0/24
            Require ip 80.171.2.0/23
            Require ip 80.171.4.0/22
            Require ip 80.171.8.0/21
            Require ip 80.171.16.0/20
            Require ip 80.171.32.0/19
            Require ip 80.171.64.0/18
        </RequireAny>
    </RequireAll>
</Directory>

0

至少在位置(位置、目录、文件和.htaccess指令中)似乎是单独评估的,最后按出现顺序相反的顺序进行评估。我没有完全检查,也找不到相关文档。

长话短说

通过放置

,我可以实现我想要的效果。

<Location /secure/>
    Require all denied
    <RequireAll>
        Require user user1 user2 user3
        AuthBasicProvider file
        AuthType Basic
        AuthName "Secure Folder Login"
        AuthUserFile /securePath/userAuth
    </RequireAll>
</Location>

在虚拟主机配置文件中,在<Location />Require ip 1.2.3.4</Location>下方(上面的方法不起作用),使用<Directory>块或.htaccess都无法解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接