错误的鱿鱼代理正则表达式?→ ^.*堆栈溢出.*.



我有几个 Squid 的代理规则文件,它们都包含如下规则:

acl blacklisted dstdom_regex ^.*facebook.* ^.*youtube.* ^.*games.yahoo.com.*

模式与域名匹配:dstdom_regex表示目标(服务器)正则表达式模式匹配

目标是阻止一些网站,但我不知道通过什么方法:域名,域名中的关键字,...

让我们扩展/描述模式:

^.*stackexchange.*     The whole pattern
^                       String beginning
 .*                     Match anything (greedy quantifier, I presume)
   stackexchange        Keyword to match
                .*     Any number of dots (.)

完全合法的比赛:

  • stackexchange.com : 堆栈交换网站。
  • stackoverflow.stackexchange:虚构的堆栈交换通用顶级域。

但这些可能的匹配使它看起来更像是一个关键字块:

  • stackexchange
  • stackexchanger
  • notstackexchange
  • not-stackexchange
  • some-website.stackexchange
  • some-website.stackexchange-tld

并且该模式似乎包含一个错误,因为它允许以下无效情况匹配,这要归功于最后的.*,尽管它们从未自然发生过:

  • stackexchange.
  • stackexchange...
  • stackexchange..........
  • stackexchange.......com
  • stackexchange.com
  • stackexchangecom
  • 你明白了。

任何包含stackexchange的东西,即使与其他所有内容用点分隔,仍然是有效的匹配。


所以现在,问题本身:

这一切都意味着这简直是stackexchange的匹配!(我假设原作者不打算匹配无限点。

那么为什么不直接使用模式stackexchange呢?除了"错误"(.*)之外,它不会更快并给出相同的结果吗?

也就是说,^.*stackexchange不等同于stackexchange吗?


编辑:澄清一下,我没有编写那些代理规则文件。

我不明白你为什么用.*来匹配以下所有点

但是,要绕过您的问题,您可以尝试一下:

  • ^[^.]*.stackexchange.*

[^.]*匹配除点之外的任何内容 .然后你匹配点

编辑 : 格式化

最新更新