📘 第六章 HTTP首部
📄 一句话概括

DNT: 1 是客户端在说「别跟踪我」。它只是请求——服务端可以不听,也没有任何强制力。 2020 年 W3C 已停止推进,这个首部就此搁浅。

📝 本节和前面几节的关系

上一节是一个已经没人实现的响应首部,这一节是一个没人必须遵守的请求首部。 两个都是「协议写了,生态没接」。

一、只认两个值

1 表示「我不想被跟踪」,0 表示「我不介意」。 Demo 里还试了一个 yes——规范不认,服务端按「未表态」处理。 请求字节数:不发是 36,DNT: 0 和 DNT: 1 都是 44,写 yes 是 46。 三个字节的差别,换来的是一个几乎没有约束力的表态。 注意它是请求首部,方向和服务端的响应无关。 服务端想表达「我遵守了」,规范里没有对应的响应首部——这也是它失败的征兆之一。

二、三重自愿,等于没有

第一重:发不发由浏览器决定。主流浏览器里只有部分默认开启,而且各家的默认值来回变过。 第二重:听不听由站点决定。没有任何强制力,也没有惩罚机制。 广告商完全可以照旧跟踪,只是不回一句「我听了」。 第三重:它自己会变成指纹。 DNT 开着还是关着,本身就是一条可区分的信息——一个「想防跟踪」的用户,反而更容易被认出来。 三重自愿叠起来,结果就是:愿意遵守的站点本来就不跟踪,不愿遵守的照旧。它没有改变任何人的行为。

三、它留下的教训

2020 年,W3C 的跟踪保护工作组停止推进,DNT 事实上作废。现在的做法换了两条腿:法规和技术。 法规这条腿是 GDPR 那类「事先同意」机制——默认不跟踪,要跟踪得先问。 技术这条腿是浏览器自己动手:分区 cookie、默认拦第三方 cookie、把追踪脚本按域名切断。 所以 DNT 的位置很典型:协议层面的善意,抵不过利益层面的阻力。 记住这一点,比记住它的取值有用。

四、动手 Demo:四种取值,看服务端怎么反应

客户端分别不发、发 0、发 1、发一个错的 yes; 服务端按「有没有明确说要 1」来决定走哪条分支,量出请求字节数。

def fn(raw, st):
    got = hd_of(raw, u'dnt')
    allow = got and got[0].strip() == u'1'
    body = (u'按不跟踪处理' if allow else u'正常处理')
    return X.reply(u'HTTP/1.1 200 OK', [], body.encode('utf-8'))

实跑输出:

--------------------------------------------------------------------
DNT:一句礼貌的请求,没人必须听
--------------------------------------------------------------------
  客户端发的 DNT     请求字节   服务端(按规范应有的反应)
  (不发)           36         正常处理:记日志、下发广告 cookie
  0                  44         正常处理:记日志、下发广告 cookie
  1                  44         按不跟踪处理:不记日志、不下发广告 cookie
  yes                46         正常处理:记日志、下发广告 cookie

  最后一行 `yes` 是故意写错的:规范只认 `0` 和 `1`,
  写别的等于没写,服务端按「未表态」处理。

  这套机制的问题是**全靠自愿**:
    一、发不发由浏览器决定,主流浏览器里只有部分默认开启;
    二、听不听由站点决定,没有任何强制力,也没有惩罚;
    三、它自己会变成指纹——DNT 开着还是关着,反而能用来区分用户。

  所以 2020 年 W3C 的跟踪保护工作组干脆停止推进,这个首部就此搁浅。
  现在真要限制跟踪,靠的是法规(比如 GDPR 的同意机制)
  和技术(CSP、分区 cookie、浏览器自带的拦截),不是这一行字。

四种请求的字节数是 36、44、44、46。三个值的长度差只有几个字节。 只有 DNT: 1 那一行走进了「不跟踪」分支;0、不发、yes 全走「正常处理」。 yes 那一行说明一件事:规范只认 0 和 1,写别的等于没写。 服务端如果做了「非 1 即放行」的判定,错值就等于默认同意。 这里的分支是 Demo 自己写的「规范应有的反应」,不是任何真实站点的行为。 现实里绝大多数站点根本不看这个首部——那才是它失败的原因。

30 秒实验

  1. 把判定改成「非 0 即不跟踪」,看 yes 那行的结果会怎么变。
  2. 查一查自己浏览器的 DNT 默认值。
  3. 想一想:为什么「用户主动表态」这种机制在商业场景里很难生效?

常见误区

  1. 「DNT 是强制标准」——纯自愿,且 2020 年已停止推进。
  2. 「发了 DNT: 1 站点就必须遵守」——没有约束力,也没惩罚。
  3. 「DNT 值可以随便写」——只认 0 和 1,别的按未表态处理。
自测三问(点开对答案) 1. `DNT` 的两个合法值是什么? —— `1` 表示不想被跟踪,`0` 表示不介意。 2. 为什么它最终失败了? —— 全靠自愿:发不发看浏览器、听不听看站点、没有强制力和惩罚。 3. 现在限制跟踪靠什么? —— 法规(GDPR 那类事先同意)和技术(分区 cookie、默认拦第三方)。

最后一个字段更彻底:它连「谁来看」这件事都已经没有实现者了。

相关笔记