URL拦截规则

本文介绍,在X浏览器下如何撰写URL拦截规则,如果你已经对ABP的拦截规则语法比较熟识,完全可以可以使用ABP的规则语法撰写规则,X浏览器兼容ABP规则的语法规则,这里我们只介绍经X浏览器简化更易于上手的规则语法。

匹配域名的规则

单一域名规则,只要资源URL的域名可以匹配就会被命中。

示例1

最简单的情况,使用完整的域名作为拦截规则,如下所示。

www.example.com

下面这个资源URL会被规则命中。

https://www.exammple.com/paht/of/banner.js

示例2

也可以使用子域名或者和通配符一起组成拦截规则,比如下面的规则,

example.com
*.example.com
.example.com

上面的规则效果相同,选择自己习惯的写法即可,下面这些资源URL会被命中

https://a.example.com/paht/of/banner.js
https://b.example.com/paht/of/banner.js
https://en.ad.example.com/paht/of/banner.js

示例3

通配符用于模糊匹配,可以简化规则的编写,下面是更多使用通配符的例子。

ad.*.example.com

下面的资源URL会被命中

https://ad.img.example.com/paht/of/banner.js
https://ad.js.example.com/paht/of/banner.js

示例4

s*.example.com

可以命中类似下面的资源URL

https://s1.example.com/paht/of/banner.js
https://s2.example.com/paht/of/banner.js
https://s3.example.com/paht/of/banner.js

匹配路径的规则

通过路径作为匹配条件,只要路径能够匹配就会被命中,如下面的示例。

示例1

/path/of/banner.js
*/path/of/banner.js

这两条规则是等价的,可以命中下面的资源URL

https://www.example.com/path/of/banner.js
https://mydomain.com/path/of/banner.js
https://www.example.com/en/path/of/banner.js

示例2

/path/*/banner.js

同样也可以使用通配符,类似下面的资源URL都会被命中。

https://www.example.com/path/of/banner.js
https://www.example.com/path/of/first/banner.js

示例3

/path/of/banner.*

类似下面的的资源URL会被命中。

https://www.example.com/path/of/banner.js
https://www.example.com/path/of/banner.png
https://www.example.com/path/of/banner.jpg

匹配查询参数的规则

通过查询参数作为匹配条件,只要查询参数能够匹配就会被命中,如下面的示例。

示例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
https://www.example.com/path/of/banner.js?frm=jp&ct=tokyo&dit=100083

组合使用

通过上面的示例我们可以知道,拦截规则可以分别匹配域名、路径、查询参数,不仅如此,我们可以组合起来获取更加精确的匹配。

示例1

example.com/path/of/banner.js?frm=

可以命中类似下面资源URL

https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080
https://s1.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100081

示例2

使用通配符

example.com/*?frm=cn&ct=*&dit=

会命中类似下面的资源URL

https://www.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080
https://s1.example.com/service/ad/banner?frm=cn&ct=sz&dit=100024

进阶用法

使用控制参数”$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
https://ad01.example.com/path/of/banner.js?frm=cn&ct=bj&dit=100080
https://ad02.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
https://ad123.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
--ad(\d{1,2})?\.example\.com$3p
/path/of/banner.js$~3p@example.com

性能建议

请优先使用不含通配符的规则,单纯的域名、路径、查询参数或则它们的组合匹配速度非常快,无需遍历查找,几十万的规则条数也不会影响其性能。

带有通配符的规则,其内部我们会转换为正则表达式的贪婪模式,众所周知,正则表达式的贪婪模式性能会比较低一些。所以尽可能优先使用不含通配符的域名、路径、查询参数的组合来撰写规则。

举例说明, 优化后的规则会有更好的额性能。

*/path/of/banner.js
example.com/ads/*
?frm=ch&ct=bj&dit=*

建议改为

/path/of/banner.js
example.com/ads/
?frm=ch&ct=bj&dit=