Apache 2.4.3 SSI, если expr нет переменных?

У меня много файлов с небольшими отличиями. Включенный файл содержит это, которое пытается различать одну часть более длинного пути:

<!--#if expr="${DOCUMENT_URI}=/internet/"-->Internet<!--#else-->Intranet<!--#endif-->

В журнале ошибок я получаю

AH01337: Не удалось проанализировать выражение "${DOCUMENT_URI}=/internet/" в файле /opt/apache/htdocs/ssi/time.shtml: ошибка анализа рядом с "$"

Я нахожу много вариаций на эту тему, например, отсутствие фигурных скобок, круглые скобки внутри кавычек, пробел перед концом комментария или =~, но ничего не помогает. Похоже, что для mod_include нет параметра отладки, который бы сказал мне, что не так...

Другой вариант, который я нашел, это

<!--#if expr='"${DOCUMENT_URI}"=~/internet/'-->

это не дает ошибки. Но он всегда выбирает ветвь else, как и REQUEST_URI, как если бы переменные не были установлены. Но я могу повторить их хорошо. Я также пробовал /.+internet.+/ на случай, если он привязывал это.

Поскольку это CGI-переменные, я также пытался загрузить cgid_module — тоже ничего хорошего.


person Daniel    schedule 28.01.2013    source источник
comment
Хорошо, нашел. Видимо в 2.4 все поменяли и теперь нужна недокументированная (кроме примера) функция v для доступа к переменным по имени. Итак, это работает: <!--#if expr='v("REQUEST_URI")=~/internet/'-->   -  person Daniel    schedule 29.01.2013


Ответы (5)



Как отмечали многие другие люди, вы можете использовать стиль v("foo"), но примеры, приведенные в документации Apache 2.4 (http://httpd.apache.org/docs/2.4/expr.html#examples) задайте следующую форму:

<!--#if expr="%{DOCUMENT_URI} =~ /internet/"-->Internet<!--#else-->Intranet<!--#endif-->

Обратите внимание на % вместо $ в переменной и =~ для соответствия регулярному выражению.

Я только что проверил это, и он отлично работает.

(Или используйте SSILegacyExprParser on, как уже упоминалось, для обеспечения обратной совместимости с форматом 2.2.x. Но я ожидаю, что эта совместимость будет удалена в какой-то момент в отдаленном будущем..)

person David Gardner    schedule 17.08.2016

У меня это работает с:

 <!--#if expr='v("foo") = "bar"' -->
 foo is bar
 <!--#endif --> 

См. раздел элементы управления потоком.

person Jorj    schedule 08.11.2015

Более новые версии Apache используют ap_expr. Я просто хотел добавить соответствующую ссылку: документы Apache. Обратите внимание, что функция v еще не задокументирована.

person Christoph    schedule 05.02.2013

Переменная преобразуется в текстовую строку, поэтому ее необходимо заключить в двойные кавычки, и вам нужно избежать этих двойных кавычек.... (предупреждение, что это может быть устаревшим синтаксисом - я использовал его на своем старом Apache 1 и просто никогда не менял это при обновлении):

<!--# if expr="\"$DOCUMENT_URI\"=/internet/" -->
person Charles Gregory    schedule 26.05.2013