本文介绍,在X浏览器下如何撰写URL拦截规则,如果你已经对ABP的拦截规则语法比较熟识,完全可以可以使用ABP的规则语法撰写规则,X浏览器兼容ABP规则的语法规则,这里我们只介绍经X浏览器简化更易于上手的规则语法。
匹配域名的规则
单一域名规则,只要资源URL的域名可以匹配就会被命中。
示例1
最简单的情况,使用完整的域名作为拦截规则,如下所示。
www.example.com |
下面这个资源URL会被规则命中。
https://www.exammple.com/paht/of/banner.js |
示例2
也可以使用子域名或者和通配符一起组成拦截规则,比如下面的规则,
example.com |
上面的规则效果相同,选择自己习惯的写法即可,下面这些资源URL会被命中
https://a.example.com/paht/of/banner.js |
示例3
通配符用于模糊匹配,可以简化规则的编写,下面是更多使用通配符的例子。
ad.*.example.com |
下面的资源URL会被命中
https://ad.img.example.com/paht/of/banner.js |
示例4
s*.example.com |
可以命中类似下面的资源URL
https://s1.example.com/paht/of/banner.js |
匹配路径的规则
通过路径作为匹配条件,只要路径能够匹配就会被命中,如下面的示例。
示例1
/path/of/banner.js |
这两条规则是等价的,可以命中下面的资源URL
https://www.example.com/path/of/banner.js |
示例2
/path/*/banner.js |
同样也可以使用通配符,类似下面的资源URL都会被命中。
https://www.example.com/path/of/banner.js |
示例3
/path/of/banner.* |
类似下面的的资源URL会被命中。
https://www.example.com/path/of/banner.js |
匹配查询参数的规则
通过查询参数作为匹配条件,只要查询参数能够匹配就会被命中,如下面的示例。
示例1
&ct=bj&dit= |
类似下面的资源URL可以被命中
https://www.example.com/path/of/banner.js?lang=en&ct=bj&dit=100060 |
示例2
使用通配符
?frm=*&ct=*&dit= |
类似下面的资源URL会被命中
https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
组合使用
通过上面的示例我们可以知道,拦截规则可以分别匹配域名、路径、查询参数,不仅如此,我们可以组合起来获取更加精确的匹配。
示例1
example.com/path/of/banner.js?frm= |
可以命中类似下面资源URL
https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
示例2
使用通配符
example.com/*?frm=cn&ct=*&dit= |
会命中类似下面的资源URL
https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
进阶用法
使用控制参数”$3p”
3p是””third-party”的简写,有时候我们只希望我们的拦截规则只对站外的资源生效,换句话讲就是规则只应用于和当前网站域名不同的资源URL。这时候我们只需要在规则后面加入控制参数”$3p”,如下面的示例。
/path/of/banner.js$3p |
假设我们当前访问的网站是 www.example.com , 规则会命中下面的资源URL
https://mydomain.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
而放行下面这个资源URL
https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
使用控制参数”$~3p”
和控制参数”$3p” 相反,我们有时希望拦截规则只对站内的资源生效,换句话讲就是规则只应用于和当前网站同一域名下的资源URL。这时候我们需要用到控制参数”$~3p”,如下面的示例。
/path/of/banner.js$~3p |
假设我们当前访问的网站是 www.example.com , 规则会命中下面的资源URL
https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
而放行
https://mydomain.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
使用正则表达式
如果你比较熟悉正则表达式的话,可以直接通过正则表达式匹配资源URL。我们约定正则表达式规则以”–” 开头,后面紧跟正则表达式,示例如下。
--ad(\d{1,2})?\.example\.com |
可以拦截类似下面的资源URL
https://ad.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
但下面这些虽然很类似但是无法和正则匹配的资源URL会被放行
https://ads.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080 |
增加域名作用域
为了使规则更加精确,避免误伤其他站点的资源。我们可以为规则增加域名作用域,限定规则只在作用域指定的域名下生效,格式为“规则@域名列表”,如下示例。
/path/of/banner.js@my.example.com |
此规则只在域名为my.example.com 的站点可以生效
/path/of/banner.js@example.com |
此规则在一级域名为example.com的站点可以生效
/path/of/banner.js@my.example.com,mysite.com,myspace.com |
规则在指定的多个域名下面可以生效
组合使用
普通的规则和控制参数是可以组合在一起使用的,下面是一些合法的规则示例。
/path/of/banner.js$3p@example.com |
性能建议
请优先使用不含通配符的规则,单纯的域名、路径、查询参数或则它们的组合匹配速度非常快,无需遍历查找,几十万的规则条数也不会影响其性能。
带有通配符的规则,其内部我们会转换为正则表达式的贪婪模式,众所周知,正则表达式的贪婪模式性能会比较低一些。所以尽可能优先使用不含通配符的域名、路径、查询参数的组合来撰写规则。
举例说明, 优化后的规则会有更好的额性能。
*/path/of/banner.js |
建议改为
/path/of/banner.js |