当前的 Adblock Plus 版本允许您通过多种不同的方法来优化过滤规则。本文档将向您介绍具体操作方法。
本章节描述的过滤规则属性,对于偶尔编写过滤规则的用户来说已经足够。

一款全网视频聚合APP,无广告,无隐私:点击下载

查看广告过滤汇总 | 点这里

声明:这里给出的过滤规则只是示例,不一定能直接使用。

基本过滤规则

最简单的过滤规则就是您想要屏蔽的横幅广告地址,但这些地址通常会在您每次打开页面时发生变化。例如:
http://example.com/ads/banner123.gif,其中 123 是一个随机数字。
在这种情况下,屏蔽整个图片地址是无效的,您需要创建一条更通用的过滤规则 —— 例如:
http://example.com/ads/banner*.gif
或者更通用的规则:http://example.com/ads/*

注意:不要使用通配符来代替过多的字符。过滤规则 http://example.com/* 虽然可以屏蔽所有横幅广告,但也会屏蔽

example.com 下其他您想看的内容。

定义例外规则

有时您可能会发现某个过滤规则平时屏蔽广告效果很好,但在某些情况下会屏蔽不该屏蔽的内容。您不想移除这条过滤规则,但也不希望它屏蔽不该屏蔽的内容。

这就是例外规则的好处——它们允许您定义过滤规则不被使用的情况。例如,如果您不满意过滤规则 adv 屏蔽了
http://example.com/advice.html,您可以定义一条例外规则 @@advice
例外规则和普通过滤规则类似,您可以使用通配符或正则表达式。只需在规则前添加 @@ 来声明这是一个例外规则。

例外规则的功能可以更强大。 如果您指定了 $document 选项,您将为整个页面获得一个例外。例如,如果您的例外规则是
@@||example.com^$document,并且您打开了来自 example.com 的某个页面 —— Adblock Plus
将在此页面上完全禁用,不会屏蔽任何内容。

匹配网址开头/结尾

通常 Adblock Plus 在处理过滤规则时,会默认在过滤规则的开头和结尾都有一个通配符。例如,过滤规则 ad*ad* 是相同的。
正常情况下这没有问题,但有时您可能需要定义可以匹配网址开头或结尾的过滤规则。例如,您想要屏蔽所有的 Flash,但如果您添加过滤规则 swf,地址
http://example.com/swf/index.html 同样也会被屏蔽。

解决方法: 使用管道符号 (|) 来表示地址的最前端或最末端。

  • 例如,过滤规则 swf| 会屏蔽 http://example.com/annoyingflash.swf,但不会屏蔽 http://example.com/swf/index.html
  • 过滤规则 |http://baddomain.example/ 会屏蔽 http://baddomain.example/banner.gif,但不会屏蔽 http://gooddomain.example/analyze?http://baddomain.example

有时您想屏蔽 http://example.com/banner.gifhttps://example.com/banner.gif
http://www.example.com/banner.gif。这时只需在过滤规则的域名前加上两个管道符号
(||):||example.com/banner.gif 将会屏蔽上述地址,而不会屏蔽
http://badexample.com/banner.gif
http://gooddomain.example/analyze?http://example.com/banner.gif(需要 Adblock
Plus 1.1 或更高版本)。

标记分隔符

通常您需要允许过滤规则匹配任何分隔符。例如,您可能编写一条规则来屏蔽 http://example.com/
http://example.com:8000/,但不能屏蔽 http://example.com.ar/。在这里,符号 (^) 用作分隔符。
http://example.com^(需要 Adblock Plus 1.1 或更高版本)。

分隔符可以是除了字母、数字或者 _ - . % 之外的任何字符。网址的结尾也被视为一个分隔符。在下面的例子中,所有分隔符用红色标出:
http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82
因此,这个地址可以通过以下过滤规则进行过滤:
^example.com^^%D1%82%D0%B5%D1%81%D1%82^^foo.bar^

注释

任何以感叹号 (!) 开头的规则都被视为注释。在过滤规则列表中,这些规则仍然会显示,但会以灰色而非黑色显示。Adblock Plus
在判断规则时会忽略这些注释,因此我们可以写下任何想写的内容。您可以在一条规则上方说明该规则的用途,也可以在过滤列表顶部写上作者信息(大多数过滤列表的作者已经这样做了)。

特殊注释

特殊注释仅在下载的过滤规则列表中生效,在自定义列表中无效。它们可以为该过滤规则列表设置许多参数:

! Homepage: http://example.com/

此注释表明哪个网页是该过滤规则列表的首页。

! Title: FooList

此注释为该过滤规则列表设置一个固定的标题。如果此注释存在,用户不能再更改该标题。

! Expires: 5 days

此注释设置该过滤规则列表的更新间隔,指定的值可以是天数(例如 5 days)或小时数(例如 8 hours)。可以提供 1 小时至 14 天之间的值。
注意: 更新并不一定会在指定的间隔到达时立即发生。实际的更新时间会稍微随机化,并取决于一些额外因素,以减少服务器负载。

! Checksum: OaopkIiiAl77sSHk/VAWDA

此注释确保数据的意外损坏不会导致过滤规则出现意外损坏。例如,一些防火墙软件可能会在下载时修改像 */adnetwork/*
这样的过滤规则,试图保护用户免受广告侵扰。但这会导致过滤规则的部分内容被移除,Adblock Plus 将只会看到过滤规则像是 **
过滤规则列表中的校验和注释就是为了防止这种情况,任何修改都将导致校验和与内容不匹配,然后 Adblock Plus 将忽略该数据。

计算该校验和需要执行以下步骤:

  1. 移除现存的校验和及注释(如果有)。
  2. 使用 UTF-8 编码对过滤规则列表的文本进行编码。
  3. 转换所有换行符为 Unix 样式(如有 \r 则替换为 \n)。
  4. 移除空行(用单个 \n 字符替换连续的 \n 字符)。
  5. 计算该文本的 MD5 校验和的 Base64 编码,并去除结尾的 = 字符(如果有)。

您也可以参考基于 Python 实现的 验证校验和添加校验和到文件 作为参考。

! Redirect: http://example.com/list.txt

此注释表明该过滤规则列表已被转移到新的下载地址。Adblock Plus 将忽略此注释后的任何文件内容,并立即尝试从新地址下载。
如果成功,过滤规则列表的地址将按此设置更新。如果新地址与当前地址相同,此注释将被忽略,意味着它可以作为该过滤规则列表的“权威”地址使用。

! Version: 1234

此注释定义过滤规则列表的数字版本。此版本号将显示在问题报告中,并可用于验证报告指向的是否是过滤规则列表的当前版本。

进阶功能

本章节描述的特性通常只有高级用户和维护过滤列表的作者才会用到。普通用户可以跳过。

指定过滤规则选项

Adblock Plus 允许您指定某些选项来改变某条规则的行为。您可以在过滤规则的最后面,将这些选项放在美元符号 ($) 后面,并用逗号 (,) 分隔。
例如:
*/ads/*$script,match-case
这里的 */ads/* 是实际的过滤规则,scriptmatch-case 是指定的选项。以下是目前支持的选项:

  • 类型选项: 判定过滤规则(或例外规则)过滤元素的类型。过滤规则可以指定多个类型选项来过滤指定的元素类型。可指定的类型包括:

    • script —— 外部脚本,由 HTML <script> 标签加载
    • image —— 正常图片,通常由 HTML 的 <img> 标签载入
    • stylesheet —— 外部 CSS 样式文件
    • object —— 由浏览器插件处理的内容,例如 Flash 或 Java
    • xmlhttprequest —— 使用 XMLHttpRequest 对象或 fetch() API 发起的请求
    • object-subrequest —— 插件的请求,比如 Flash
    • subdocument —— 内嵌的页面,通常通过 HTML 的框架方式内嵌
    • ping —— 由 <a ping>navigator.sendBeacon() 发起的请求(需要 Adblock Plus 2.7.1 或更高版本)
    • websocket —— 通过 WebSocket 对象发起的请求(需要 Adblock Plus 2.8 或更高版本)
    • webrtc —— 通过 RTCPeerConnection 实例连接到 ICE 服务器的连接(Adblock Plus for Chrome 和 Opera 需要 1.13.3 或更高版本,Adblock Plus for Firefox 和 Safari 尚不支持)
    • document —— 网页本身(仅适用于例外规则)
    • elemhide —— 仅适用于例外规则,类似于 document,但只禁用页面上的元素隐藏规则,而不是所有规则(需要 Adblock Plus 1.2 或更高版本)
    • generichide —— 仅适用于例外规则,类似于 elemhide,但只禁用页面上的通用元素隐藏规则(需要 Adblock Plus 2.6.12 或更高版本)
    • genericblock —— 仅适用于例外规则,类似于 generichide,但禁用的是通用屏蔽规则(需要 Adblock Plus 2.6.12 或更高版本)
    • other —— 不属于上述类型的其他请求

类型选项 backgroundxbldtd 已过时,不应再使用。

  • 反转类型选项: 指定过滤规则应用的元素类型。可指定的类型选项:~script, ~image, ~stylesheet, ~object, ~xmlhttprequest, ~object-subrequest, ~subdocument, ~document, ~elemhide, ~other

  • 第三方/第一方请求限制: 如果指定了 third-party 选项,则过滤规则仅适用于来源与当前正在浏览页面不同的请求。类似地,~third-party 适用于来源与当前浏览页面相同的请求。

  • 域名限定: 选项 domain=example.com 表示过滤规则仅适用于 “example.com“ 下的页面。多个域名可以用 “|” 分隔:

    过滤规则 domain=example.com|example.net 将仅适用于 “example.com“ 或 “example.net“ 的页面。
    如果域名前有 “~“,则该过滤规则不适用于此域名的页面。例如:

    • domain=~example.com 表示过滤规则适用于除 example.com 之外的任何域名的页面。
    • domain=example.com|~foo.example.com 表示过滤规则适用于 “example.com“ 但不包括其子域名 “foo.example.com“。
  • Sitekey 限制: 选项 sitekey=abcdsitekeydcba 意味着该过滤规则应该只在页面上提供了一个与过滤规则内包含的公钥(没有 = 后缀)非常相似且可被验证的签名时才应用。可以使用 “|” 作为分隔符指定多个 sitekey:

    使用 sitekey=abcdsitekeydcba|bcdesitekeyedcb 作为过滤规则的选项时,将仅在页面提供了 “abcdsitekeydcba” 或 “bcdesitekeyedcb” 的 sitekey 时应用。这类似于域名限制,但这允许单条过滤规则应用到相当多的域。

    注意:sitekey 限制需要服务器端的修改。

  • match-case —— 使过滤规则仅匹配大小写完全一致的地址。例如:过滤规则 */BannerAd.gif$match-case 会屏蔽 http://example.com/BannerAd.gif,但不会屏蔽 http://example.com/bannerad.gif

  • collapse —— 此选项将覆盖全局的“隐藏已屏蔽元素的占位符”选项,并确保过滤规则总是隐藏这些元素。类似地,~collapse 选项将确保过滤规则不隐藏这些元素。

  • donottrack —— 对于匹配了带有此选项的屏蔽规则,且未匹配到带有此选项的例外规则的地址,会发送一个 Do-Not-Track 头(需要 Adblock Plus 1.3.5 或更高版本)。为了向后兼容,使用此选项时建议使用矛盾的组合类型选项,以防止此规则在早期版本的 Adblock Plus 中屏蔽任何内容:*$donottrack,image,~image

使用正则表达式

如果您想更好地控制您的过滤规则,决定什么匹配、什么不匹配,您可以使用正则表达式。例如,过滤规则 /banner\d+/ 会匹配 banner123
banner321,但不会匹配 banners。您可以查看正则表达式的文档来学习如何编写正则表达式。

注意:出于性能原因,建议尽可能避免使用正则表达式。

元素隐藏

基本规则

有时您可能会发现无法屏蔽某些内嵌在网页中的文字广告。如果查看网页源代码,可能会发现类似这样的代码:

1
2
3
4
5
6
7
8
9
10
<div class="textad">
最便宜的豆腐,仅限此时此地!
</div>
<div id="sponsorad">
真正便宜的豆腐,点击这里!
</div>
<textad>
只有在这里您才能买到最好的豆腐!
</textad>

因为您必须下载页面的内容,所以您也必须下载这些广告。对于这种情况,您能做的就是把这些广告隐藏起来,这样您就看不到它们了。这就是元素隐藏的意义所在。

上面代码中的第一则广告是在一个 class 属性为 “textad” 的 div 容器内。过滤规则 ##div.textad 可以隐藏它。这里的
## 表明这是一条元素隐藏规则,其余部分是定义需要隐藏元素的选择器。
同样,您可以通过 id 属性来隐藏:##div#sponsorad 会隐藏第二个广告。
您不需要指定元素的名称,过滤规则 ##*#sponsorad 同样有效。
您也可以仅指定要屏蔽的元素名称来隐藏,例如:##textad 可以隐藏第三则广告。

在不查看页面源码的情况下,Element Hiding Helper 扩展可以帮助选择正确的元素并编写相应的规则。具备基础的 HTML
知识还是很有用的。

注意:元素隐藏规则与普通屏蔽规则的工作方式有很大不同。元素隐藏规则不支持通配符

限定在特定域名的规则

通常您只想隐藏特定网站的特定广告,而不希望规则影响其他网站。例如,过滤规则 ##*.sponsor 可能会隐藏某些网站的有效代码。
但如果您将其写为 example.com##*.sponsor,它就只会在 http://example.com/
http://something.example.com/ 上生效,而不会在 http://example.org/ 上生效。
您也可以指定多个域名——只需用逗号 (,)
分隔即可:domain1.example,domain2.example,domain3.example##*.sponsor

如果在域名前有 “~“,则该过滤规则不适用于此域名的页面(需要 AdBlock Plus 1.1 或更高版本)。例如:

  • ~example.com##*.sponsor 将适用于除 “example.com“ 之外的任何域名。
  • example.com,~foo.example.com##*.sponsor 适用于 “example.com“ 但不适用于其子域名 “foo.example.com“。

注意:由于元素隐藏的实现方式,您只能将隐藏规则限定在完整的域名上。您不能使用网址的其他部分,也不能用 domain 代替

domain.example,domain.test

注意:限定域名的元素隐藏规则也可用来隐藏浏览器的用户界面。例如,过滤规则 browser##menuitem#javascriptConsole 会隐藏

Firefox 工具菜单中的 JavaScript 控制台。

属性选择器

一些广告隐藏起来并不容易——它们可能既没有 id 也没有 class 属性。您可以使用其他属性来隐藏它们。

  • 例如 ##table[width="80%"] 可以隐藏 width 属性值为 80% 的表格元素。
  • 如果您不想指定属性的完整值,##div[title*="adv"] 会隐藏所有 title 属性包含 “adv” 字符串的 div 元素。
  • 您还可以检查属性的开始和结束字符,例如 ##div[title^="adv"][title$="ert"] 会隐藏 title 属性以 “adv” 开头并以 “ert” 结尾的 div 元素。

正如您所见,您可以使用多个条件 —— table[width="80%"][bgcolor="white"] 会匹配 width 属性为 80% 且
bgcolor 属性为 white 的表格元素。

高级选择器

通常情况下,Firefox 支持的 CSS 选择器都可用于元素隐藏。例如:下面的过滤规则会隐藏 class 属性为 adheaderdiv
元素后面相邻的任何元素:##div.adheader + *。完整的 CSS 选择器列表请查看 W3C CSS 规范(Firefox
目前并未支持所有选择器)。

注意:这个功能仅供高级用户使用,您需要能熟练使用 CSS 选择器。Adblock Plus 无法检查您添加的选择器语法是否正确,如果您使用了无效的 CSS

语法,可能会破坏其他已有的有效过滤规则。建议使用 JavaScript 控制台检查是否有 CSS 错误。

例外规则

例外规则的作用是在特定域名中禁用已有的元素隐藏规则。这对于那些与其他订阅列表配合使用,且无法修改该订阅列表的用户或作者来说非常有用。
例如,要禁用 example.com 上的 ##div.textad 规则,可以使用
example.com#@#div.textad。这条组合规则等同于 ~example.com##div.textad
建议您仅在无法调整全局隐藏规则时才使用例外规则,否则应优先使用限定在特定域名的规则。

简单元素隐藏语法

Adblock Plus 支持简单元素隐藏语法(例如:#div(id=foo))只是为了向后兼容。使用这种语法并不好,CSS
选择器才是首选
。对此语法的支持可能在未来的某个版本中移除。

通用/特定过滤器

随着 $generichide$genericblock 过滤选项的出现,区分通用过滤器和特定过滤器变得重要起来。

我们将匹配一个或多个域名或匹配一个 sitekey 的过滤器归类为特定过滤器。如果过滤器没有指定域名(或仅有域名例外)且没有
sitekey,则它被视为通用过滤器
例如,example.com##div.textad 是一个特定过滤器,而 ##div.textad
~example.com##div.textad 都是通用过滤器。

请注意,对于屏蔽规则,域名必须在 $domain 选项下指定才能被视为特定规则。例如,||example.com^ 被认为是通用的,而
*/ads/*$domain=example.com 是站点特定的。

在服务器上实施 Sitekey

若要实现一个采用 sitekey 限制的过滤规则,网页需要返回 Base64 编码的公钥版本以及 Adblock Plus
可以验证的签名。目前,这需要通过以下两种方式提供:

  1. 在 HTTP 响应头中包含:X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba
  2. 在 document 的根标签(<html>)中包含:<html data-adblockkey="abcdpublickeydcba_abcdsignaturedcba">

实施步骤:

  1. 首先,您需要创建一个专用的 RSA 密钥(最好是 512 位以降低传输开销)以及公钥的 DER 表示。
  2. 用于创建签名的数据是一个由请求变量(即 URI、Host 和 User-Agent)组成的连续列表,分隔符是 NUL 字符(即 \0)。
    例如:
    /index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0
  3. 最后,使用 SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE 签名算法(这是使用 OpenSSL 时的默认算法)生成此字符串的签名。