Вопрос по .htaccess, apache – Определить версию Apache в конфиге apache?

20

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

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

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

С Apache 2.4 старыйПорядо get устарела в пользу Требовать.

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

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

что означает, что Apache не запускается, пока я не включу Access_compat. Хотя это представляет собой полезный обходной путь, я хочу решение, которое работает с обоими синтаксисами, так как конфигурация будет распространяться на множество серверов. Вопрос в том, как определить текущую версию Apache и применить правильную директиву.

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

Ваш Ответ

5   ответов
30

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

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

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all granted
</IfModule>
фантастический ответ. Кажется, все собирается для 2.4, но у меня 2.2, это позволяет прямую совместимость! Keith
... или, если этот модуль отсутствует на обоих концах, но ваш локальный / промежуточный сервер является win (и Apache 2.x), а ваш live-версия - linux (и Apache 2.y), проверьте наличие любых других отличий модулей, т.е.<IfModule !mod_win32.c> Frank Nocke
15

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

<IfVersion >= 2.4>
    # Require ...
</IfVersion>
<IfVersion < 2.4>
    # Order ...
    # Deny ...
    # Allow ...
</IfVersion>
Я рекомендую этот ответ. Если вы можете позволить себе дополнительную зависимость, этот подход намного яснее. Кроме того, если mod_authz_core когда-либо отключен при использовании подхода в принятом ответе, тогда файл конфигурации будет предполагать, что он работает на 2.2 и продолжит работу независимо. Удаление mod_version здесь будет просто означать, что сервер откажется запускаться. seanhodges
2

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

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

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

+ 1 для параметров IfDefine и -D. Это действительно не помогает мне, хотя. Запуск двух версий веб-сервера выглядит какмног работы, когда простой if / else должен уметь ее решить. Можете ли вы расширить «отдельные каталоги» немного больше? Проверка текущей версии кажется мне очень хорошим решением. Немного расширил вопрос о том, почему. Letharion
1

используя mod_rewrite для контроля доступа:

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

потому что 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 есть.

Похожие вопросы