7

我已经在我的实时站点上设置了 htpasswd 身份验证,它工作得很好,但是当我在开发环境中工作时,我不想被要求输入密码。

在我的 httpd.conf 文件中,我有:

SetEnv APP_ENV "development"

在我的.htaccess文件中,我有:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user

我想知道是否有在 htppasswd 内容周围放置条件的方法,以便何时APP_ENV不会development提示我输入密码。

这可能吗?

4

5 回答 5

6

如果可以的话,你应该考虑升级到Apache 2.4(或者最新的 2.3 beta 版本,因为 2.4 还没有完全发布)。

可用的新功能之一是授权容器- 使用Require指令定义访问要求变得更加简单。

你应该最终得到类似的东西:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /path/to/file/groups

SetEnv APP_ENV "development"

<RequireAll>
  <RequireAny>
    <RequireAll>
      #main requirements
      Require group user
      #other conditions if needed for non-dev/non-local
    </RequireAll>

    <RequireAll>
      #allow direct if development
      Require env APP_ENV development
    </RequireAll>

    <RequireAll>
      <RequireAny>
        #allow loopback and local network
        Require ip 127.0.0.1
        Require ip 10.2
      </RequireAny>
    </RequireAll>
  <RequireAny>

  #other conditions if needed for everyone

  <RequireNone>
    #blacklist
  </RequireNone>
</RequireAll>
于 2012-01-12T01:00:45.503 回答
3

使用环境变量构建 if 条件块的一种方法是使用mod_macro模块。我之前在这里做了一个例子。

在这种特殊情况下,您将在 VirtualHost 文件之上(在 VirtualHost 定义之前):

<Macro ConditionalBlockMacroSecurity_production>
    AuthName "Restricted Area"
    AuthType Basic
    AuthUserFile /path/to/file/.htpasswd
    AuthGroupFile /dev/null
    require valid-user
</Macro>
<Macro ConditionalBlockMacroSecurity_development >
    <IfModule mod_headers.c>
       Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request."
    </IfModule>
</Macro>

在虚拟主机内部:

Use ConditionalBlockMacroSecurity_${APP_ENV}

其中 htpassword 文件的路径也可以设置为宏的参数。

此解决方案的缺点是您需要在生产服务器上安装 mod_macro,它不是一个常用的模块,您需要对生产环境进行一些控制才能做到这一点。另一方面,一个简单的解决方案是根据环境拥有多个版本的虚拟主机,并在 Auth 部分添加一些注释。但是,如果您正在寻找一个通用的解决方案,那肯定意味着这是一个经常出现的问题,并且您希望避免手动编辑文件,在这种情况下,mod_macro 可以成为一种非常专业的方式来利用您的 apache 体验,直到您的 apache 配置变成单个宏带参数,调用很多其他的宏。

于 2012-01-11T21:49:35.920 回答
2

Apache 配置中的条件仅在 [重新] 加载配置时起作用。

我要做的是创建第二个具有相同根目录的 VirtualHost,并根据那里的 IP 地址使用拒绝/允许来控制访问。

于 2010-07-26T13:18:13.863 回答
2

添加以下内容:

Require valid-user
Allow from <dev IP>
Satisfy Any

这将要求Require valid-user Allow from <dev IP>适用。

于 2012-01-10T21:00:37.793 回答
2

在您的.htaccess文件中,您可以将块嵌套在 IfDefine 指令中,例如:

<IfDefine PROD>
  bla bla bla
</IfDefine>

然后确保-D PROD在启动 apache 时作为参数传递。此部分仅在定义 PROD 时运行。在 Ubuntu 中,您可以通过例如编辑/etc/apache2/envvars并在末尾添加这一行来做到这一点:

export APACHE_ARGUMENTS="-D PROD"

您可以通过使用类似仅在不是开发环境时运行的东西来“反转”它<IfDefine !DEV>,然后在该环境中传递 -D DEV ,并保持生产站点不变而无需编辑环境变量。

进行相应修改以满足您的需求!

于 2012-01-12T02:08:04.797 回答