Ответ 1
Взлом, который я использовал.
# Apache 2.2
<IfModule !mod_authz_core.c>
Satisfy Any
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
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 "агностик".
Взлом, который я использовал.
# Apache 2.2
<IfModule !mod_authz_core.c>
Satisfy Any
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
Предполагая, что у вас установлен mod_version (по умолчанию его отправляют многие дистрибутивы), вы можете сделать следующее:
<IfVersion >= 2.4>
# Require ...
</IfVersion>
<IfVersion < 2.4>
# Order ...
# Deny ...
# Allow ...
</IfVersion>
Вы можете запускать разные версии Apache на одном хосте. В: Что не так с отдельными конфигурационными файлами в отдельных каталогах? Я честно считаю, что, возможно, самый чистый подход...
Тем не менее, файлы Apache.conf позволяют <IfDefine>
, которые вы можете указать во время выполнения с помощью "-D":
Вы можете обойти необходимость знать с помощью mod_rewrite для вашего контроля доступа:
RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$
RewriteRule .* - [F,L]
Я столкнулся с этой проблемой, потому что 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.