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

标签 php apache .htaccess apache2 .htpasswd

简短摘要

我需要能够在 Apache 站点配置中设置环境变量,以定义该站点是开发版、测试版还是生产版。

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

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

站点配置

Apache 配置(开发/测试版)

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

是这样的:

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

SetEnv environment_type dev

- 或 -

SetEnv environment_type beta


Apache 配置(生产)

生产站点的 apache 配置可以根本不设置,也可以设置:

SetEnv environment_type prod

但这是可选的


.htaccess (设置站点配置变量)

用于数据库连接、域名等的配置变量将在公共(public) 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 and 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'];

关于php - 使用 apache config 和 htaccess 为开发和生产动态设置配置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671140/

相关文章:

javascript - 在年历的json数据源中填充mysql数据

php - 脚本中的 elseif 语句过多

apache - Apache Ambari修补程序信息

php - 调试和测试 mod_rewrite (.htaccess) 指令的工具

perl - 当用作 cgi-bin 时,如何使用 setuid() 成功运行 Perl 脚本?

.htaccess - htaccess 重定向而不改变 url

.htaccess - 重写规则以仅检测数字

javascript - 在 HTML 中使用 php 和正则表达式匹配定义类名

php - Magento 将数据库从开发版更新为上线版

php - .htaccess 301 使用 php get 查询重定向(旧 url 到新更新)