时间:2010-07-26 13:14:58

标签: .htaccess .htpasswd setenv conditional

5 个答案:

答案 0 :(得分:6)

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

可用的新功能之一是Authorization Containers - 使用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>

答案 1 :(得分:3)

构建带有env变量的条件块的方法之一是使用 mod_macro 模块。 我之前做了一个例子here

在这种特殊情况下,您将拥有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>

在Virtualhost中:

Use ConditionalBlockMacroSecurity_${APP_ENV}

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

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

答案 2 :(得分:2)

答案 3 :(得分:2)

添加以下内容:

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

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

答案 4 :(得分:1)

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

<IfDefine PROD>
  bla bla bla
</IfDefine>

然后确保在启动apache时将-D PROD作为参数传递。仅当定义了PROD时,此部分才会运行。在Ubuntu中,您可以通过编辑/etc/apache2/envvars并在最后添加此行来执行此操作:

export APACHE_ARGUMENTS="-D PROD"

您可以通过使用类似<IfDefine !DEV>之类的东西来“逆转”它,只有当它不是开发环境时运行,然后在该环境中传递-D DEV,并且不必编辑就保留生产站点envvars中。

根据您的需要进行相应修改!