使用 apache config 和 htaccess 为开发和生产动态设置配置变量


Using apache config and htaccess to dynamically set config vars for dev and production

简短摘要

我需要能够在 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'];