我想阻止一个域,但特定子域除外。
例如,我使用test.domain.com
作为生产环境,并拒绝来自squid的所有访问。但我想允许squid用户访问test.demo.domain.com
,这是一个测试环境。
我的squid.conf:
acl denylist dstdom_regex ^(?!.*(demo)).*domain.com$
http_access deny denylist
http_access allow all
我知道我的正则表达式出了什么问题。Squid regex使用GNU regex(请参阅服务器故障问题(,GNU regex无法理解(?!.*(demo))
。
那么如何在GNU正则表达式中排除特定子域呢?
首先,应该使用负向后看(?<!
(而不是负向前看(?!
(。其次,我认为它不能与^
一起工作,因为它从域的一开始就匹配。第三,与.*domain.com
匹配整个域,所以应该使用.domain.com
。
在.domain.com
之前任何地方与demo不匹配的正确正则表达式将是
(?<!(.*demo.*)).domain.com
这里,域必须以.domain.com
结尾,并且必须事先在任何位置都不包含demo
才能匹配。
在您的情况下不需要regex
你说你只需要允许一个特定的子域。所以在ACL中添加这个子域并允许访问它
acl allowed_subdomain dstdomain test.demo.example.com
acl blocked_domain dstdomain .example.com
http_access allow allowed_subdomain
http_access deny blocked_domain
http_access deny all
解释:
Squid将读取配置文件以查找匹配项,它遇到的第一个匹配项将结束它的工作。