Назад | Перейти на главную страницу

Условные операторы apache - каков порядок обработки?

Я пытаюсь защитить доступ к подкаталогу с помощью 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 не обрабатывается в течение того же времени выполнения? Или просто на более ранней стадии этой среды выполнения, на каком-то этапе предварительной компиляции?