使用apache config和htaccess为dev和production动态设置配置变量

Cor*_*mer 10 php apache .htaccess apache2 .htpasswd

简短的摘要

我需要能够在Apache站点配置中设置一个环境变量,用于定义站点是开发,测试还是生产.

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

我还需要在位于另一个目录中的另一个htaccess中使用web根htaccess中定义的变量之一.

站点配置

Apache配置(dev/beta)

我想在他们的Apache站点配置文件中为我的dev和beta环境设置一个环境变量

像这样的东西:

(我确定它不是正确的语法)

SetEnv environment_type dev
Run Code Online (Sandbox Code Playgroud)

- 要么 -

SetEnv environment_type beta
Run Code Online (Sandbox Code Playgroud)


Apache Config (生产)

生产站点apache config可能根本不设置它,或者它可以:

SetEnv environment_type prod
Run Code Online (Sandbox Code Playgroud)

但这是可选的


.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>
Run Code Online (Sandbox Code Playgroud)


使用定义的设置

我需要能够使用这些新的配置变量,不仅在我的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>
Run Code Online (Sandbox Code Playgroud)

目前.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>
Run Code Online (Sandbox Code Playgroud)


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');
?>
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 12

你基本上是对的.您可以使用SetEnv设置环境变量:

SetEnv ENVIRONMENT_TYPE "DEV"
Run Code Online (Sandbox Code Playgroud)

此外,鉴于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"
Run Code Online (Sandbox Code Playgroud)

并在 /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"
Run Code Online (Sandbox Code Playgroud)

/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>
Run Code Online (Sandbox Code Playgroud)

然后在PHP中,您可以使用getenv()或访问环境变量:

echo $_SERVER['ENVIRONMENT_TYPE'], "\n";
$db_user = $_SERVER['DB_USER'];
Run Code Online (Sandbox Code Playgroud)