Apache 2.4如何仅针对特定主机要求有效用户

时间:2014-05-31 04:06:20

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

如果主机是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

  

因为否定的授权指令无法返回   成功的结果,他们不能显着影响结果   &LT; RequireAny&GT;指示。 (最多可能导致指令   在失败并且所有其他指令返回的情况下失败   中立价值。)因此否定的授权指令不是   允许在&lt; RequireAny&gt;内指令。

这不起作用:

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

这看起来像一个黑客,需要几个小时才能搞清楚。我是否未能找到完成我非常简单目的的正确的方法?还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我就是这样做的。
(使用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>

答案 1 :(得分:0)

您只能使用&#34;而不是&#34; RequireAll块上的指令,而不是身份验证指令。

  

可以通过使用not选项取消Require指令的结果。与其他否定授权指令一样,当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>