Я хочу написать конфигурацию для сервера apache, который должен работать с apache-2.2 и -2.4 без изменений. Поскольку в v2.4 есть несколько новых модулей, которые необходимо загрузить, и несколько измененных директив, мне понадобятся некоторые условные операторы. Я бы хотел что-то вроде
<If ApacheVersion >= 2.4>
LoadModule mod_only_in_2.4.so
</If>
но я еще не нашел правильного выражения. Может ли кто-нибудь указать мне правильное направление?
Разъяснение моих мотивов: я разрабатываю сервер, который я хочу просто скопировать на сервер и запустить без дальнейшей настройки, зависящей от хоста. И поскольку на машинах может быть любая версия apache, мне нужна конфигурация, которая работает в обоих случаях.
Вы должны проверять модуль, а не версию Apache.
Например:
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Allow from all
</IfModule>
Обратите внимание, что вы не можете заранее угадать, есть ли у кого-то конкретная версия Apache; Системный администратор должен убедиться, что загружаются правильные модули. Все, о чем вам, как разработчику, действительно нужно беспокоиться, это то, что вы предоставляете правильные директивы, в зависимости от того, какие модули доступны.
Как системному администратору вам придется поддерживать разные конфигурации для Apache 2.2 и 2.4; нет никакого способа обойти это. К счастью, каждая система управления конфигурацией делает это относительно легко, и если вы еще не используете такую систему, вы должны это сделать.
Если mod_version
загружен, который должен быть доступен по умолчанию (хотя и не загружен по умолчанию) как в Apache 2.2, так и в 2.4, вы можете использовать <IfVersion>
директива для проверки версии Apache (и только Apache):
<IfVersion >= 2.3>
# this happens only in versions greater or
# equal 2.3.0.
</IfVersion>
Пример взят из документации.
Вот что я в итоге сделал: я отредактировал свой стартовый скрипт, чтобы установить переменную, определяющую версию apache
apache_version_string=`$apache_bin -v|grep -oP "Apache/(\d\.\d)"`
if [[ $apache_version_string == "Apache/2.2" ]]; then
server_flags=$server_flags" -DAPACHEv22"
else
if [[ $apache_version_string == "Apache/2.4" ]]; then
server_flags=$server_flags" -DAPACHEv24"
fi
fi
и в конфигурации apache я проверил эти определения
<IfDefine APACHEv24>
LoadModule authz_core_module /usr/lib/apache2/mod_authz_core.so
</IfDefine>