Php 使用ApacheConfig和htaccess为开发人员和生产人员动态设置配置变量 小结

Php 使用ApacheConfig和htaccess为开发人员和生产人员动态设置配置变量 小结,php,apache,.htaccess,apache2,.htpasswd,Php,Apache,.htaccess,Apache2,.htpasswd,我需要能够在Apache站点配置中设置一个环境变量,该变量定义站点是dev、beta还是production web根目录中的htaccess文件将根据Apache配置中的条目定义网站的配置变量(数据库凭据、域等) 此外,我还需要在另一个目录中的另一个htaccess中使用web根htaccess中定义的一个变量 站点配置 Apache配置(开发/测试版) 我想在Apache站点配置文件中为我的开发环境和测试环境设置一个环境变量 大概是这样的: (我确信这不是正确的语法) -或- SetEnv

我需要能够在Apache站点配置中设置一个环境变量,该变量定义站点是dev、beta还是production

web根目录中的htaccess文件将根据Apache配置中的条目定义网站的配置变量(数据库凭据、域等)

此外,我还需要在另一个目录中的另一个htaccess中使用web根htaccess中定义的一个变量

站点配置 Apache配置(开发/测试版) 我想在Apache站点配置文件中为我的开发环境和测试环境设置一个环境变量

大概是这样的: (我确信这不是正确的语法)

-或-

SetEnv environment_type beta

Apache配置(生产) 生产站点apache配置可能根本无法设置它,也可能会执行以下操作:

SetEnv environment_type prod
但这是可选的


.htaccess(设置站点配置变量) 用于数据库连接、域名等的配置变量将在公共webroot的.htaccess文件中设置,如下所示:

(同样,只是模型语法)


SetEnv base_dir/www/example.com/dev/
SetEnv db_主机localhost
SetEnv db_name devdb
SetEnv db_用户devuser
SetEnv db_密码devpass
SetEnv web_域www.devdomain.com
SetEnv cookie_domain.devdomain.com
SetEnv base_dir/www/example.com/beta/
SetEnv db_主机localhost
SetEnv db_name betadb
SetEnv db_用户betauser
SetEnv db_密码betapass
SetEnv web_域www.betadomain.com
SetEnv cookie_domain.betadomain.com
SetEnv base_dir/www/example.com/www/
SetEnv db_主机localhost
SetEnv db_name proddb
SetEnv db_用户produser
SetEnv db_密码prodpass
SetEnv web_域www.proddomain.com
SetEnv cookie_domain.proddomain.com

使用定义的设置 我需要能够使用这些新的配置变量,不仅在我的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>
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>
AuthName“管理区”
AuthType“基本”
AuthUserFile base_dir+“/web/sam/.htpasswd”
AuthGroupFile“/dev/null”
ErrorDocument 404/sam/error.shtml
需要有效用户
Current.htaccess:

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>
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>
AuthName“管理区”
AuthType“基本”
AuthUserFile“/www/example.com/beta/web/sam/.htpasswd”
AuthGroupFile“/dev/null”
ErrorDocument 404/sam/error.shtml
需要有效用户

config.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');
?>

你基本上是对的。可以使用以下命令设置环境变量:

此外,鉴于
htaccess
是从服务器配置向下通过相关目录解析的,直到Apache认为请求可以从中得到服务的目录为止,您可以在其他
htaccess
文件中使用先前定义的环境变量

但是不能组合/连接环境变量,只能使用指令根据其他环境变量的值生成环境变量

此外
setenif
指令中,您只能检查同样由
setenif
创建的环境变量:

例如,
/etc/apache2/sites enabled/001项目

# 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
中,您可以使用以下指令:

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>

哇!谢谢你给我如此详细的解释和回答!不用担心,这是一个很酷的问题,在回答的过程中我学到了一些东西:)完美。我在弄清楚如何在If语句中使用SetEnvIf的值集时遇到了困难,这有助于清理它。
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>
echo $_SERVER['ENVIRONMENT_TYPE'], "\n";
$db_user = $_SERVER['DB_USER'];