【问题标题】:Apache 2.4 how to Require valid-user only for specific hostsApache 2.4 如何仅对特定主机要求有效用户
【发布时间】:2014-07-20 21:40:00
【问题描述】:

如果主机是 dev.example.com 或 test.example.com,我想告诉 Apache 2.4.9 要求有效用户。这不起作用:

AuthType Basic
AuthName "Speak, friend, and enter."
AuthBasicProvider file
AuthUserFile /sites/example/conf/.htpasswd
AuthGroupFile /dev/null
SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected
SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected
Require valid-user
Require not env env_is_protected

它会导致服务器错误;显然not env 无效contrary to the documentation

在以下示例中,前五行始终与第一个示例相同。

这不起作用:

SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected
SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected
<RequireAny>
    Require valid-user
    <RequireNone>
        Require env env_is_protected
    </RequireNone>
</RequireAny>

它会导致服务器错误。 documentation explains

因为否定授权指令无法返回 成功的结果,他们不能显着影响结果 指令。 (最多他们可以使指令 在它们失败并且所有其他指令返回的情况下失败 中性值。)因此否定授权指令不是 在 指令中允许。

这不起作用:

SetEnv env_is_unprotected 1
SetEnvIfNoCase Host ^dev\.example\.com$ !env_is_unprotected
SetEnvIfNoCase Host ^test\.example\.com$ !env_is_unprotected
Require valid-user
Require env env_is_unprotected

文档explains about SetEnv

该指令设置的内部环境变量设置后 大多数早期请求处理指令都会运行,例如访问 控制和 URI 到文件名的映射。如果环境变量 你正在设置的意思是作为这个早期处理阶段的输入 例如 RewriteRule 指令,您应该改为设置 带有 SetEnvIf 的环境变量。

这行得通:

SetEnvIf Host . env_is_unprotected
SetEnvIfNoCase Host ^dev\.example\.com$ !env_is_unprotected
SetEnvIfNoCase Host ^test\.example\.com$ !env_is_unprotected
Require valid-user
Require env env_is_unprotected

这看起来像一个 hack,需要几个小时才能弄清楚。我是否没有发现正确方法来实现我的非常简单的目的?有没有更好的办法?

【问题讨论】:

    标签: apache .htaccess httpd.conf basic-authentication server-configuration


    【解决方案1】:

    这就是我的做法。
    (使用 Cj Case 的优秀引文作为评论来解释细节。:D)

    SetEnvIfNoCase HOST ^dev\.example\.com$ env_is_protected
    SetEnvIfNoCase HOST ^test\.example\.com$ env_is_protected
    <RequireAny>
        <RequireAll>
            # when the Require directive is negated it can only fail or return a neutral result, 
            # and therefore may never independently authorize a request
            # (reason why we need an additional "all granted" here!)
            Require all granted
            Require not env env_is_protected
        </RequireAll>
        AuthType Basic
        AuthName "Speak, friend, and enter."
        AuthUserFile /sites/example/conf/.htpasswd
        Require valid-user
    </RequireAny>
    

    【讨论】:

      【解决方案2】:

      您只能在 RequireAll 块上使用“not”指令,而不能作为身份验证指令。

      Require 指令的结果可以通过使用 not 选项来否定。与其他否定授权指令一样,当 Require 指令被否定时,它只能失败或返回中性结果,因此可能永远不会独立授权请求。

      http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

      这可能会起作用:

      <Directory /your/protected/directory/>
        AuthType Basic
        AuthName "Speak, friend, and enter."
        AuthBasicProvider file
        AuthUserFile /sites/example/conf/.htpasswd
        AuthGroupFile /dev/null
      
        SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected
        SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected
      
        <RequireAll>
          Require valid-user
          Require not env env_is_protected
        </RequireAll>
      </Directory>
      

      【讨论】:

      • not env 无效,问题明确指出。
      • 据我所知应该在 RequireAll 块内有效。
      • 我怀疑这是正确的答案,但我还没有接受它,因为我还没有开始测试它。它在我的待办事项清单上,很抱歉这么慢。
      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2018-03-23
      • 2014-11-10
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多