我有几个 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.*
[^.]*
匹配除点之外的任何内容 .
然后你匹配点
编辑 : 格式化