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