Я пытаюсь защитить доступ к подкаталогу с помощью http auth, используя конфигурацию файла .htaccess.
В моем случае это полный рабочий код для apache 2.4.
# Conditionally set environment variable BACKEND_PROTECTION (version for apache 2.4)
<If "%{HTTP_HOST} == 'www.somedomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
<RequireAny>
<RequireAll>
Require not env BACKEND_PROTECTION
Require all granted
</RequireAll>
<RequireAll>
AuthType Basic
AuthName "Protected URI"
AuthUserFile /var/www/config/.htpasswd
Require valid-user
</RequireAll>
</RequireAny>
Теперь мне нужно дополнительно исключить подкаталог этого каталога из аутентификации, так что я попробовал это.
<If "%{HTTP_HOST} == 'www.somedomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
# disable protection for backend files loaded in frontend
SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION
Но это не работает, после этого кода следующие <RequireAny>
блок сверху запускает аутентификацию http, как если бы BACKEND_PROTECTION был все еще установлен. Но если я положу отрицание внутрь <If></If>
он работает как положено.
<If "%{HTTP_HOST} == 'www.somedomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION
</If>
Почему так? Что именно означает следующее утверждение, взятое из документации If?
Описание: содержит директивы, которые применяются, только если условие удовлетворяется запросом во время выполнения.
Другой код внутри .htacces не обрабатывается в течение того же времени выполнения? Или просто на более ранней стадии этой среды выполнения, на каком-то этапе предварительной компиляции?