# 问题分析 1. **问题现象**:规则更新后,规则没有生效。用户添加或删除规则后,DNS服务器仍然使用旧的规则进行域名屏蔽。 2. **问题根源**: - 在`addDomainRule`方法中,当添加一个域名规则时,它会为该域名的所有子域名也添加规则。例如,添加`example.com`规则时,会同时添加`example.com`和`com`规则。 - 但是,在`RemoveRule`方法中,当删除一个域名规则时,它只删除了指定的域名规则,而没有删除为子域名添加的规则。 - 这导致即使删除了主规则,子域名规则仍然存在,因此规则仍然生效。 3. **具体问题**: - 当添加`||test.example.com`规则时,`addDomainRule`方法会添加`test.example.com`和`example.com`两个规则。 - 当删除`||test.example.com^`规则时,`RemoveRule`方法只会删除`test.example.com`规则,而不会删除`example.com`规则,因此`example.com`仍然会被屏蔽。 - 此外,`RemoveRule`方法在处理通配符和URL匹配规则时,也没有正确处理子域名规则的删除。 # 修复方案 1. **修复`RemoveRule`方法**: - 当删除一个域名规则时,同时删除为该域名的所有子域名添加的规则。 - 确保删除规则时,同时更新所有相关映射,包括主规则和子域名规则。 2. **验证修复效果**: - 启动DNS服务器 - 添加一条域名规则,例如`||test.example.com` - 验证该规则及其子域名规则都被正确添加 - 删除该规则 - 验证该规则及其所有子域名规则都被正确删除 - 验证DNS服务器不再使用该规则进行域名屏蔽 # 实现步骤 1. 修改`shield/manager.go`文件中的`RemoveRule`方法: - 在删除域名规则时,添加删除所有相关子域名规则的逻辑 - 确保删除规则时,同时更新所有相关映射 2. 测试修复后的功能: - 启动DNS服务器 - 访问Web界面,添加一条本地规则,例如`||test.example.com` - 验证该规则被正确添加 - 点击删除按钮删除该规则 - 验证该规则及其所有子域名规则都被正确删除 - 验证DNS服务器不再使用该规则进行域名屏蔽 # 预期结果 - 用户添加规则后,规则立即生效 - 用户删除规则后,规则立即失效 - 规则更新后,DNS服务器使用最新的规则进行域名屏蔽 - 本地规则文件被正确更新,添加和删除的规则都能正确反映在文件中