我在我的实时站点上设置了 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_ENVdevelopment 没有提示我输入密码。

这可能吗?

有帮助吗?

解决方案

如果可以的话,您应该考虑升级到 阿帕奇2.4 (或最新的 2.3 beta 版本,因为 2.4 尚未完全发布)。

可用的新功能之一是 授权容器 - 使用以下命令可以更简单地定义访问要求 要求 指示。

你最终应该得到类似的结果:

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>

其他提示

使用环境变量构建 if 条件块的方法之一是使用 模组宏 模块。我之前举过一个例子 这里.

在这种特殊情况下,您将在 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 配置成为单个宏带参数,调用很多其他宏。

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

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

添加以下内容:

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

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

在你的 .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,并按原样保留生产站点,而无需编辑环境变量。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top