У меня есть директива RewriteRule в Apache, которую я хотел бы применять только в том случае, если присутствует собственный HTTP-заголовок.
Что я пробовал:
<If "%{HTTP:X-MyCustomHeader} in { 'present' }">
RewriteRule ^/$ /present.html [NC,R=301,L]
</If>
<Else>
RewriteRule ^/$ /absent.html [NC,R=301,L]
</Else>
Это вообще не работает, ни RewriteRule не применяется.
Альтернатива, которую я пробовал:
<If "-n req_novary('X-MyCustomHeader')">
Тоже не работает.
Я тестирую с завитком, как
curl -is http://example.com/ -H X-MyCustomHeader: присутствует
Чтобы убедиться, что заголовок присутствует и виден, я попытался использовать переменную env:
SetEnvIf X-MyCustomHeader ^(присутствует)$ MY_CUSTOM_VAR=$1
Заголовок всегда устанавливает X-MyCustomHeader "### FOUND ###" env=MY_CUSTOM_VAR
Это работает, как и ожидалось, и я получаю FOUND в ответ.
Но опять же, когда я пытаюсь использовать переменную env в операторе IF, она не срабатывает, например.
<If "-n env('MY_CUSTOM_VAR')">
Как я могу сделать это с ЕСЛИ? И да, я знаю, что есть условие RewriteCond для проверки переменных среды, но мне нужно использовать и другие директивы, поэтому я хотел бы переключать их в блоке IF.
Согласно документам: https://httpd.apache.org/docs/trunk/en/expr.html#functions
Когда переменные среды просматриваются в условии, важно учитывать, насколько рано в обработке запроса происходит это разрешение. Как правило, любая директива, определенная вне контекста виртуального хоста (каталог, местоположение, htaccess), скорее всего, еще не успела выполниться. SetEnvIf в области виртуального хоста — это одна директива, которая выполняется до этого разрешения.
Итак, согласно документам, переменные SetEnvIf должны работать, но не работают?