Использование конфигурации 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'];