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

Почему моя директива SetEnvIfNoCase не соответствует запрошенному URI?

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

В своем тестировании я настроил Apache для использования определенного документа при отображении HTTP 503 ошибка:

# Service Unavailable
ErrorDocument 503 /errors/error_503.shtml

В этом документе, используя директивы SSI и переменные среды, я построил некоторую логику if / else, которая может условно включать тот или иной заголовок на основе содержимого переменной среды. Это мой тестовый файл:

<!--#if expr="${is_corporate}" -->
corporate here.
<!--#else -->
I'M NOT CORPORATE.
<!--#endif -->
<!--#echo var="is_corporate" --> 
<!--#echo var="REQUEST_URI" --> 
This is a 503 error message! Check it out!

Однако я не могу сопоставить URI запроса, используя SetEnvIf в конфигурации apache по непонятной мне причине.

   <Location />
      # Allow error documents to use the application or corporate header as appropriate
      SetEnvIfNoCase Request_URI /corporate/home/ is_corporate   # this does not match
      SetEnvIfNoCase Request_URI ^/$ is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/c is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/C is_corporate                # this does not match
      SetEnvIfNoCase Request_URI .*/ is_corporate                # this matches
      SetEnvIfNoCase Request_URI .*  is_corporate                # this matches
    </Location>

В этом конкретном случае мой документ об ошибке, распечатывающий содержимое REQUEST_URI отображает: /Corporate/Home/, и всегда указывает, что is_corporate пусто. С помощью SetEnvIfNoCase должно сделать это совпадение нечувствительным к регистру, но попытки прописных / строчных букв, похоже, не имеют значения.

Поскольку SetEnvIf Предполагается, что регулярное выражение должно быть совместимым с pcre, я тестировал регулярное выражение в perl, просто чтобы убедиться, что мое регулярное выражение законно и должно работать так, как я предполагаю:

vezult@zapazoid:~$ echo '/Corporate/Home' |perl -e 'while(<>) { if (/^\/c/i) { print("match!!: $_\n");} else { print("no match: $_\n"); }}'
match!!: /Corporate/Home

Оно делает. В любом случае, я в тупике. Что мне может не хватать, что мешает моему SetEnvIf заявление о том, чтобы вести себя так, как я ожидал?

SetEnvIf's Request_URI Кажется, что параметр обновлен путем добавления пути к документу об ошибке, когда он находится в процессе его обслуживания.

Одним из способов решения этой проблемы было бы сопоставление с чем-то еще, у которого был бы родительский путь, например Referer заголовок.