Получить части DOCUMENT_URI с помощью регулярного выражения и SSI

Я использую Apache 2.4 и Server Side Includes.

Когда я использую это:

<!--#echo var="DOCUMENT_URI" -->

Возвращает: /foo/bar/file.html

Я хочу захватить части URI, а именно:

  <!--#if expr='v("DOCUMENT_URI") =~ [\/\\](.+)[\/\\](.+)[\/\\](.+)[.]'-->
    <!--#set var='URI_PART1' value='$1' -->
    <!--#set var='URI_PART2' value='$2' -->
    <!--#set var='URI_PART3' value='$3' -->
  <!--#else -->
  <!--#endif -->

Я пробовал много вариантов, но никак не могу заставить Apache распознавать регулярное выражение. Я ожидал, что будут записаны «foo», «bar» и «file», но вместо этого получил сообщение об ошибке [произошла ошибка при обработке этой директивы].

Я знаю, что синтаксис изменился со времен Apache 2.4, и вышеизложенное - это то, что я придумал, основываясь на моем понимании нового синтаксиса.

Любая помощь приветствуется!


person mCpXZKq3ruqgFXrvvAWRj9cYxk8RLX    schedule 01.02.2017    source источник
comment
Что ж, взгляните на daveoncode.com/2009/10/29/. Возможно, все, что вам нужно, - это использовать регулярное выражение /^(.*)\./ и установить переменную как <!--#set var="mypath" value="$1" --> (возможно, вы можете добавить косую черту после $1, если нет, объедините позже).   -  person Wiktor Stribiżew    schedule 01.02.2017
comment
Спасибо за совет. Я пробовал следующее: [code] ‹! - # set var = $ DOCUMENT_URI value = / ^ (. *) \ ./--› и некоторые варианты, но он сказал [произошла ошибка при обработке этой директивы]. Я читал, что в Apache 2.4 есть новый синтаксис, но я не уверен, что это проблема, поскольку другие директивы работают нормально ..   -  person mCpXZKq3ruqgFXrvvAWRj9cYxk8RLX    schedule 01.02.2017
comment
Это странно, я не знаю, почему возникает эта проблема. Шаблон действителен.   -  person Wiktor Stribiżew    schedule 01.02.2017


Ответы (2)


Об этом сообщается как об ошибке, но она не устранена: https://bz.apache.org/bugzilla/show_bug.cgi?id=57448

Существует обходной путь, показанный в комментарии 8, для извлечения отдельных значений через $ 0 путем добавления этого фрагмента:

&& $1 =~ /(.*)

который отображает $ 1 в $ 0, поскольку $ 0 правильно экспортируется.

Таким образом, вам придется извлекать части по одной.

Другой обходной путь - включить SSILegacyExprParser и работать с ним.

person Sam Liddicott    schedule 15.02.2018

Хорошо, есть много документации до Apache 2.4, которая очень сбивает с толку.

Ответ заключается в том, что вы не можете изолировать части $ 1, $ 2 и т. Д. Из совпадающего выражения, ЕСЛИ они не должны использоваться в другом выражении #if.

т.е. вы не можете # установить новую переменную с частью строки $ 1.

Не уверен, почему эта функция больше не возможна, но да. Вот и все.

person mCpXZKq3ruqgFXrvvAWRj9cYxk8RLX    schedule 02.02.2017