Использование конфигурации apache и htaccess для динамического конфигурирования конфигурационных vars для dev и производства

Краткое описание

Мне нужно установить переменную среды в настройке сайта Apache, которая определяет, является ли сайт dev, бета-версией или продукцией.

Файл htaccess в корневом каталоге сети будет определять переменные конфигурации для веб-сайта (учетные данные, домен и т.д.) на основе записи в конфигурации Apache

ТАКЖЕ Мне нужно использовать одну из переменных, определенных в корнях htaccess в другом htaccess, расположенном в другом каталоге.

Конфигурация сайта

Конфигурация Apache (dev/beta)

Я хотел бы установить переменную среды для своих dev и бета-сред в своих файлах конфигурации сайта Apache

Что-то вроде этого:

(Я уверен, что это не правильный синтаксис)

SetEnv environment_type dev

- или -

SetEnv environment_type beta


Конфигурация Apache (производство)

Производственные сайты Apache config может либо не устанавливать его вообще, либо он мог бы сделать:

SetEnv environment_type prod

Но это было бы необязательно


.htaccess(Установить настройки конфигурации сайта)

Конфигурационные переменные, используемые для подключения к базе данных, имени домена и т.д., затем будут установлены в файле .htaccess в общедоступном webroot следующим образом:

(опять же, просто синтаксис макета)

<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-аутентификацию для этой области.

Проблема

Запись AuthUserFile, указывающая на файл .htpasswd, должна быть динамической на основе переменных среды.

Что мне нужно:

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>


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

Ответ 1

Ты в основном прав. Вы можете установить переменную среды с помощью 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'];