修复了规则更新后没有生效的问题

This commit is contained in:
Alex Yang
2025-11-28 18:52:22 +08:00
parent ee148fe6c3
commit 16bc615a52
3 changed files with 134 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
# 问题分析
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服务器使用最新的规则进行域名屏蔽
- 本地规则文件被正确更新,添加和删除的规则都能正确反映在文件中