Определить версию Apache в конфигурации apache?

tl; dr: Как сделать следующее в файле .conf или .htaccess:

<IfApache22>
  # Do A
</IfApache22>
<IfApache24>
  # Do B
</IfApache24>

Более длительный вопрос:

С Apache 2.4 старый Order устаревает в пользу Require.

В моих файлах .htaccess у меня есть

<FilesMatch "\.(long|list|file|types)$">
  Order allow,deny
</FilesMatch>

что означает, что Apache не запускается, если я не включу access_compat. В то время как это создает полезное решение, я хочу решение, которое работает с обоими синтаксисами, так как config будет распространяться на большое количество серверов. Вопрос в том, как я могу определить текущую версию Apache и применить правильную директиву.

Я намерен использовать файл для фреймворка, который распространяется и используется многими людьми, и я не могу контролировать/гарантировать, что у них есть или нет какой-либо конкретной настройки сервера, поэтому мне бы хотелось, чтобы файл должен быть 2.2/2.4 "агностик".

Ответ 1

Взлом, который я использовал.

# Apache 2.2
<IfModule !mod_authz_core.c>
    Satisfy Any
</IfModule>

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all granted
</IfModule>

Ответ 2

Предполагая, что у вас установлен mod_version (по умолчанию его отправляют многие дистрибутивы), вы можете сделать следующее:

<IfVersion >= 2.4>
    # Require ...
</IfVersion>
<IfVersion < 2.4>
    # Order ...
    # Deny ...
    # Allow ...
</IfVersion>

Ответ 3

Вы можете запускать разные версии Apache на одном хосте. В: Что не так с отдельными конфигурационными файлами в отдельных каталогах? Я честно считаю, что, возможно, самый чистый подход...

Тем не менее, файлы Apache.conf позволяют <IfDefine>, которые вы можете указать во время выполнения с помощью "-D":

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

Ответ 4

Вы можете обойти необходимость знать с помощью mod_rewrite для вашего контроля доступа:

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$
RewriteRule .* - [F,L]

Ответ 5

Я столкнулся с этой проблемой, потому что FallbackResource не находится в ранних версиях Apache, и часто умные хостинговые компании удаляют mod_rewrite, когда у них есть версия Apache с FallbackResource. Я использую следующий .htaccess, когда хочу поместить код библиотеки, который адаптируется к его среде:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^ - [E=protossl]
    RewriteCond %{HTTPS} on
    RewriteRule ^ - [E=protossl:s]
    RewriteRule "(^|/)\." - [F]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteRule ^ index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    FallbackResource index.php
</IfModule>

Теперь, конечно, есть некоторые версии/установки Apache, где это не удается, но если mod_rewrite существует, используйте его, а если нет, надейтесь, что там будет FallbackResource.