mihomo
mihomo copied to clipboard
[Feature] geosite优先级匹配
Verify steps
- [X] 我已经在 Issue Tracker 中找过我要提出的请求 I have searched on the issue tracker for a related feature request.
- [X] 我已经仔细看过 Documentation 并无法找到这个功能 I have read the documentation and was unable to solve the issue.
Description
使用过程中遇到一个问题,某个国内tv视频网站aisee.tv,理所当然的,在geolocation-cn中,但是由于其顶级域名tv是Tuvalu的,并不是电视的意思,因为tv顶级域名会出现在tld-!cn进而被继承到geolocation-!cn中,这会造成麻烦。
这个问题看上去确实很难解。目前提供一些思路:
首先必须分流规则必须支持不以顺序作为优先级匹配,要允许同级的规则之间有一个内置的优先级,比较合理的方案
- full: full规则优先级应当最高,full之间不应该有冲突
- domain: domain规则之间冲突时,高级别域名优先级更高,比如asd.qwe.zxc在同时符合domain:qwe.zxc和domain:zxc时显然应该匹配domain:qwe.zxc
- regexp: regexp之间冲突暂时没什么好想法,可以考虑字符串长度更长的正则优先级更高?
- keyword应该最低,老实说我不太理解keyword这个功能在什么场景下可以被正确的使用
然后在这个基础上,可以允许设定一个geosite规则组,可以设定一组group,组内优先级相同,按照上述规则判定命中某一个group。
Possible Solution
No response
@cjwddtc 集合就只是集合,如果集合还判断优先级,集合又有什么意义
@cjwddtc 集合就只是集合,如果集合还判断优先级,集合又有什么意义
我没有说集合要分优先级啊,你说的集合是指group吗?还是指什么?现在的问题就是在域名分级的情况下,现有的规则是不能正确处理的,就那我的例子aisee.tv是个中国域名,geolocation-cn里面也有,但是就是由于.tv顶级域名不属于中国,导致该域名也属于geolocation-!cn。我只是提出了可一个解决该问题的思路,就是对规则内置一个优先级,然后规则中可以创建组,比如geosite:(cn direct)(geolocation-!cn proxy)类似这种效果,cn direct和geolocation-!cn proxy是同一优先级,如果域名同时命中了cn和geolocation-!cn,就按照一个特定的规则间的优先级来决定他到底命中了cn还是geolocation-!cn。
@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置
@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置
goesite不是一个域名的集合啊,他是规则的集合啊,否则的话tv只能匹配tv这个域名,如果按照你把geosite视为域名的集合的逻辑,a.tv就不应该属于tld-!cn这个集合,因为只有tld-!cn只包含tv不包含a.tv,
@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置
而在我看来geosite设计上是没办法解决这个问题的,因为事实上a.tv就是通过tld!-cn命中了geolocaltion-!cn,但是clash可以提供一个功能,让某个域名同时命中两条规则的时候,决定按那个规则算。
解决办法非常简单,由于规则是自上而下匹配,你只需要修改有问题的域名到前面优先匹配即可。无需复杂逻辑
自上而下的匹配在某些情境下其实有些不太合适。
例如:
- subdomain.a.com和b.com在direct.txt中,需要直连
- subdomain.b.com和a.com在proxy.txt中,需要代理 这时自上而下的匹配会导致需要另外再添加规则到两个rule-set到前面。
所以如果能在rules模块里加入一种新的块(类似subrule),在这个块中匹配到记录后不是立即返回结果,而是暂存匹配记录,继续遍历。遇到下一个匹配时,如果下一匹配优先级高,则替换暂存的记录,否则忽略。重复直到块中的记录被完全遍历。
优先级(
- 同一规则类型之内:同时匹配到domain-suffix a.com, domain-suffix x.a.com, 优先匹配domain-suffix x.a.com
- 不同规则类型之间:同时匹配到domain a.com, domain-suffix a.com, 优先匹配 domain a.com
- 对于优先级不好界定的,不进行替换
- 用户可以自行设定不同规则类型之间的优先级。 )
自上而下的匹配在某些情境下其实有些不太合适。
例如:
- subdomain.a.com和b.com在direct.txt中,需要直连
- subdomain.b.com和a.com在proxy.txt中,需要代理 这时自上而下的匹配会导致需要另外再添加规则到两个rule-set到前面。
所以如果能在rules模块里加入一种新的块(类似subrule),在这个块中匹配到记录后不是立即返回结果,而是暂存匹配记录,继续遍历。遇到下一个匹配时,如果下一匹配优先级高,则替换暂存的记录,否则忽略。重复直到块中的记录被完全遍历。
优先级(
- 同一规则类型之内:同时匹配到domain-suffix a.com, domain-suffix x.a.com, 优先匹配domain-suffix x.a.com
- 不同规则类型之间:同时匹配到domain a.com, domain-suffix a.com, 优先匹配 domain a.com
- 对于优先级不好界定的,不进行替换
- 用户可以自行设定不同规则类型之间的优先级。 )
这个用rule-providers可以解决吧?
这个用rule-providers可以解决吧?
direct.txt
- DOMAIN-SUFFIX,a.com
- DOMAIN-SUFFIX,m.b.com
proxy.txt
- DOMAIN-SUFFIX,m.a.com
- DOMAIN-SUFFIX,b.com
direct.txt在前, m.a.com 在proxy.txt中不会命中 proxy.txt在前, m.b.com 在direct.txt中不会命中 对于自己自定义的小列表,确实可以通过再添加一个pre-proxy.txt ( pre-proxy -- direct -- proxy) 解决 但是其他人维护的远程规则,规则数量多,只有察觉到了然后再一个一个去补充,总有漏网的鱼
而且遍历最极端的情况下相当于全部命中match,性能上也不是很差