htaccess — как применить шаблоны регулярных выражений на выходе другого — инкапсуляция

#regex #apache #.htaccess #mod-rewrite

#регулярное выражение #apache #.htaccess #мод-перезапись

Вопрос:

Я выполняю несколько регулярных выражений для строки внутри переменной, чтобы очистить ее для дальнейшего использования в правилах htaccess, но кажется довольно громоздким делать такую простую вещь в нескольких строках:

 RewriteCond %{THE_REQUEST} (?<=s)(.*?)(?=s)
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} (^.*)??
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} /(.*)
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} (.*)/$
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
  

Как я могу сократить это до 2 строк?

В основном я ищу способ инкапсулировать каждый из этапов агрегации (фильтр) на основе вывода предыдущего выражения, но мои скромные усилия потерпели неудачу после нескольких часов попыток и поиска в Интернете.

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

 $HREFPATH = trim(explode(explode(" ",$THE_REQUEST)[1],"?")[0],"/");
  

-но это НЕ вопрос, связанный с PHP; просто простой способ объяснить, что я имею в виду, и чего я пытаюсь достичь.

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

Любой ввод будет вознагражден тем же; заранее спасибо.

Ответ №1:

То, что вы делаете в нескольких правилах, может быть сделано в одном, подобном этому:

 RewriteCond %{THE_REQUEST} s/ ([^?]*?)/*[s?]
RewriteRule ^ - [E=HREFPATH:%1]
  

Подробности регулярных выражений:

  • s : Сопоставьте пробелы
  • / : Совпадение 1 / с
  • ([^?]*?) : Лениво сопоставьте 0 или более любых символов, которые не являются ? . Зафиксируйте это значение в %1
  • /* : Сопоставьте 0 или более конечных / с
  • [s?] : Должно сопровождаться ? или пробелом