【问题标题】:Varnish 3 not parsing regex pattern correctlyVarnish 3没有正确解析正则表达式模式
【发布时间】:2014-09-17 10:59:19
【问题描述】:

我正在编写一些生成 PCRE 模式的代码,这些模式用于禁止 varnish 中的对象,并且遇到 varnish 的问题,告诉我该模式无效。

这是我的代码生成的模式之一

(?i)(((^| )page\-2[^ ]*($| )))

这就是varnish告诉我的

 0 Debug        - "REGEX: <missing )>"

13 RxRequest    c BAN
13 RxURL        c /
13 RxProtocol   c HTTP/1.1
13 RxHeader     c User-Agent: curl/7.34.0
13 RxHeader     c Accept: */*
13 RxHeader     c Host: www.test.local
13 RxHeader     c X-Tags: (?i)(((^| )page\-2[^ ]*($| )))

我什至尝试在测试过程中简化模式

page-2[^ ]
page\-2[^ ]

我明白了

 0 Debug        - "REGEX: <missing terminating ] for character class>"

这样的简单模式有效

page-2.*

我正在运行varnish-3.0.2 revision cbf1284

相关的VCL是

if (req.request == "BAN") {
    ban("obj.http.X-Tags ~ " + req.http.X-Tags);
    error 200 "Banned";
}

而且,很明显原始模式是有效的

【问题讨论】:

  • 它可能不喜欢空格字面量。尝试用\s替换空格?
  • 您应该将此作为答案,因为它是问题/解决方案。不知道为什么它不喜欢空格。
  • 我已将其发布为答案。我什至想到这一点的唯一原因是因为 flex 也不喜欢空格文字。
  • 看来\x20也有效

标签: regex varnish varnish-vcl


【解决方案1】:

显然,正如我在对原始问题的评论中意外发现的那样,varnish 不喜欢正则表达式中的空格文字。这种情况下的解决方案是将空格文字替换为\s,它匹配任何空白字符,包括空格、制表符和换行符。

【讨论】:

  • 虽然我不喜欢使用 \s 而不是空格文字,但这适用于我现在的用途。
  • 玩了一圈,我意识到我也可以使用\x20
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2021-08-05
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多