答案 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中。
根据您的需要进行相应修改!