Условные операторы 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-Documentation?

Описание: содержит директивы, которые применяются, только если условие удовлетворяется запросом во время выполнения

Не обрабатывается ли другой код внутри.htacces во время выполнения? Или просто на более ранней стадии выполнения во время какого-то этапа предварительной компиляции?

0 ответов

Другие вопросы по тегам