Я пытаюсь настроить 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
заголовок.