简短摘要
我需要能够在 Apache 站点配置中设置一个环境变量,该变量定义站点是开发、测试还是生产。
Web 根目录中的 htaccess 文件将根据 Apache 配置中的条目定义网站的配置变量(数据库凭据、域等)
此外,我需要在位于另一个目录中的另一个 htaccess 中使用在 Web 根目录 htaccess 中定义的变量之一。
站点配置
Apache config (dev/beta)
我想在他们的 Apache 站点配置文件中为我的开发和测试环境设置一个环境变量
像这样:
(我确定它不是正确的语法)
SetEnv environment_type dev
-或-
SetEnv environment_type beta
Apache Config (生产)
生产站点 apache 配置要么根本无法设置它,要么可以设置:
SetEnv environment_type prod
但这将是可选的
.htaccess (设置站点配置变量)
然后,用于数据库连接、域名等的配置变量将在公共 webroot 的 .htaccess 文件中设置,如下所示:
(同样,只是模型语法)
<If (environment_type exists) && (environment_type == dev)>
SetEnv base_dir /www/example.com/dev/
SetEnv db_host localhost
SetEnv db_name devdb
SetEnv db_user devuser
SetEnv db_password devpass
SetEnv web_domain www.devdomain.com
SetEnv cookie_domain .devdomain.com
<elseif (environment_type exists) && (environment_type == beta)>
SetEnv base_dir /www/example.com/beta/
SetEnv db_host localhost
SetEnv db_name betadb
SetEnv db_user betauser
SetEnv db_password betapass
SetEnv web_domain www.betadomain.com
SetEnv cookie_domain .betadomain.com
<else>
SetEnv base_dir /www/example.com/www/
SetEnv db_host localhost
SetEnv db_name proddb
SetEnv db_user produser
SetEnv db_password prodpass
SetEnv web_domain www.proddomain.com
SetEnv cookie_domain .proddomain.com
</If>
使用定义的设置
我需要能够使用这些新的配置变量,不仅在我的 php 脚本中,而且在子目录中的另一个 .htaccess 文件中
其他.htaccess文件
我有另一个驻留在子目录中的.htaccess文件,其目的是为该区域强制执行基本的http身份验证。
问题所在
指向 .htpasswd 文件的 AuthUserFile 条目必须基于环境变量是动态的。
我需要什么:
AuthName "Admin Area"
AuthType "Basic"
AuthUserFile base_dir + "/web/sam/.htpasswd"
AuthGroupFile "/dev/null"
ErrorDocument 404 /sam/error.shtml
<Limit GET POST>
require valid-user
</Limit>
当前 .htaccess:
AuthName "Admin Area"
AuthType "Basic"
AuthUserFile "/www/example.com/beta/web/sam/.htpasswd"
AuthGroupFile "/dev/null"
ErrorDocument 404 /sam/error.shtml
<Limit GET POST>
require valid-user
</Limit>
配置.php
我已经知道这有效
然后我的 php 配置文件可以像这样获取配置值
<?php
$db['default']['hostname'] = getenv('db_host');
$db['default']['username'] = getenv('db_user');
$db['default']['password'] = getenv('db_password');
$db['default']['database'] = getenv('db_name');
?>
你基本上是对的。您可以使用 SetEnv 设置环境变量:
SetEnv ENVIRONMENT_TYPE "DEV"
此外,鉴于htaccess
是从服务器配置向下解析到相关目录,直到 Apache 认为可以从中处理请求的目录,您可以在其他htaccess
文件中使用以前定义的环境变量。
但是,您不能组合/连接环境变量,只能使用 SetEnvIf 指令根据其他环境变量的值生成环境变量。
此外,在 SetEnvIf
指令中,您只能检查也由 SetEnvIf
创建的环境变量:
例如 /etc/apache2/sites-enabled/001-project
# This has to be created by SetEnvIf, I've set the regex to match
# anything as we want the environment variable set always
SetEnvIf Host .* ENVIRONMENT_TYPE "Prod"
# Alternatively you could do:
SetEnvIf Host prod'.domain'.com ENVIRONMENT_TYPE "Prod"
SetEnvIf Host dev'.domain'.com ENVIRONMENT_TYPE "Dev"
SetEnvIf Host (www'.)?domain'.com ENVIRONMENT_TYPE "Live"
在/www/example.com/.htaccess
SetEnvIf ENVIRONMENT_TYPE "Prod" DB_USER="test"
SetEnvIf ENVIRONMENT_TYPE "Prod" DB_NAME="database"
SetEnvIf ENVIRONMENT_TYPE "Prod" DB_PASS="passwd"
SetEnvIf ENVIRONMENT_TYPE "Live" DB_USER="live"
SetEnvIf ENVIRONMENT_TYPE "Live" DB_NAME="database"
SetEnvIf ENVIRONMENT_TYPE "Live" DB_PASS="passwd"
在/www/example.com/prod/web/sam/.htaccess
中,您可以使用 IF、Else 和 ElseIf 指令:
AuthName "Admin Area"
AuthType "Basic"
<If "env('ENVIRONMENT_TYPE') == 'Prod'">
AuthUserFile "/www/example.com/prod/web/sam/.htpasswd"
</If>
<Else>
AuthUserFile "/www/example.com/beta/web/sam/.htpasswd"
</Else>
AuthGroupFile "/dev/null"
ErrorDocument 404 /sam/error.shtml
<Limit GET POST>
Require valid-user
</Limit>
然后在 PHP 中,您可以使用 getenv() 或访问环境变量:
echo $_SERVER['ENVIRONMENT_TYPE'], "'n";
$db_user = $_SERVER['DB_USER'];