mihomo icon indicating copy to clipboard operation
mihomo copied to clipboard

[Feature] geosite优先级匹配

Open cjwddtc opened this issue 1 year ago • 9 comments

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中,这会造成麻烦。

这个问题看上去确实很难解。目前提供一些思路:

首先必须分流规则必须支持不以顺序作为优先级匹配,要允许同级的规则之间有一个内置的优先级,比较合理的方案

  1. full: full规则优先级应当最高,full之间不应该有冲突
  2. domain: domain规则之间冲突时,高级别域名优先级更高,比如asd.qwe.zxc在同时符合domain:qwe.zxc和domain:zxc时显然应该匹配domain:qwe.zxc
  3. regexp: regexp之间冲突暂时没什么好想法,可以考虑字符串长度更长的正则优先级更高?
  4. keyword应该最低,老实说我不太理解keyword这个功能在什么场景下可以被正确的使用

然后在这个基础上,可以允许设定一个geosite规则组,可以设定一组group,组内优先级相同,按照上述规则判定命中某一个group。

Possible Solution

No response

cjwddtc avatar Jan 26 '24 13:01 cjwddtc

@cjwddtc 集合就只是集合,如果集合还判断优先级,集合又有什么意义

xishang0128 avatar Jan 26 '24 13:01 xishang0128

@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 avatar Jan 27 '24 16:01 cjwddtc

@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置

xishang0128 avatar Jan 27 '24 16:01 xishang0128

@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置

goesite不是一个域名的集合啊,他是规则的集合啊,否则的话tv只能匹配tv这个域名,如果按照你把geosite视为域名的集合的逻辑,a.tv就不应该属于tld-!cn这个集合,因为只有tld-!cn只包含tv不包含a.tv,

cjwddtc avatar Jan 31 '24 10:01 cjwddtc

@cjwddtc geosite就是一个"域名集合",集合就不应该区分优先级,你应该向上游提出内容问题,或者使需要直连的域名放在rules靠前的位置

而在我看来geosite设计上是没办法解决这个问题的,因为事实上a.tv就是通过tld!-cn命中了geolocaltion-!cn,但是clash可以提供一个功能,让某个域名同时命中两条规则的时候,决定按那个规则算。

cjwddtc avatar Feb 01 '24 04:02 cjwddtc

解决办法非常简单,由于规则是自上而下匹配,你只需要修改有问题的域名到前面优先匹配即可。无需复杂逻辑

flower-elf avatar Feb 19 '24 15:02 flower-elf

自上而下的匹配在某些情境下其实有些不太合适。

例如:

  • 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
  • 对于优先级不好界定的,不进行替换
  • 用户可以自行设定不同规则类型之间的优先级。 )

leftcausedit avatar Feb 28 '24 15:02 leftcausedit

自上而下的匹配在某些情境下其实有些不太合适。

例如:

  • 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可以解决吧?

jtzhpf avatar Mar 01 '24 18:03 jtzhpf

这个用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,性能上也不是很差

leftcausedit avatar Mar 05 '24 23:03 leftcausedit