如何使用squid regex acl来排除特定子域



我想阻止一个域,但特定子域除外。

例如,我使用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将读取配置文件以查找匹配项,它遇到的第一个匹配项将结束它的工作。

最新更新