【问题标题】:Get parts of DOCUMENT_URI using regex and SSI使用正则表达式和 SSI 获取 DOCUMENT_URI 的一部分
【发布时间】:2017-02-01 10:27:49
【问题描述】:

我正在使用 Apache 2.4 和服务器端包含。

当我使用这个时:

<!--#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 以来语法发生了变化,以上是我根据对新语法的理解提出的。

任何帮助表示赞赏!

【问题讨论】:

  • 好吧,看看daveoncode.com/2009/10/29/…。您可能只需要使用/^(.*)\./ 正则表达式并将变量设置为&lt;!--#set var="mypath" value="$1" --&gt;(也许您可以在$1 之后添加斜杠,如果没有,请稍后连接。)
  • 感谢您的提示。我尝试了以下方法:[code] 和一些变体,但它说[处理此指令时发生错误]。我读到 Apache 2.4 中有一种新语法,但我不确定这是否是问题,因为其他指令可以正常工作..
  • 这很奇怪,我不知道为什么会出现这个问题。模式有效。

标签: regex apache bnf ssi


【解决方案1】:

这是一个错误报告,但尚未解决:https://bz.apache.org/bugzilla/show_bug.cgi?id=57448

注释 8 中演示了一种解决方法,通过添加以下片段通过 $0 提取单个值:

&& $1 =~ /(.*)

在 $0 正确导出时将 $1 映射到 $0。

所以你必须一次提取一个。

另一种解决方法是启用并使用 SSILegacyExprParser

【讨论】:

    【解决方案2】:

    好的,所以有很多 Apache 2.4 之前的文档,这非常令人困惑。

    答案是你不能隔离 $1、$2 等部分匹配的表达式,除非它要在另一个 #if 表达式中使用。

    即你不能用字符串的 $1 部分#set 一个新变量。

    不知道为什么这个功能不再可能,但是是的。给你。

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 2017-10-23
      • 2015-06-06
      • 1970-01-01
      • 2014-09-04
      • 2015-10-03
      • 2021-12-10
      • 2021-09-27
      • 2015-09-03
      相关资源
      最近更新 更多