htaccess 条件语句
-
29-09-2020 - |
题
我在我的实时站点上设置了 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
没有提示我输入密码。
这可能吗?
解决方案
如果可以的话,您应该考虑升级到 阿帕奇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,并按原样保留生产站点,而无需编辑环境变量。
相应修改以满足您的需求!