4

如果主机是 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是无效的。

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

这不起作用:

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>

它会导致服务器错误。该文档解释说

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

这不起作用:

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

该文档解释了 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

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

4

2 回答 2

5

我就是这样做的。
(使用 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>
于 2015-06-17T10:29:10.683 回答
0

您只能在 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>
于 2015-05-10T21:35:07.377 回答