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 秒实验
- 把判定改成「非 0 即不跟踪」,看
yes那行的结果会怎么变。 - 查一查自己浏览器的 DNT 默认值。
- 想一想:为什么「用户主动表态」这种机制在商业场景里很难生效?
常见误区
- 「DNT 是强制标准」——纯自愿,且 2020 年已停止推进。
- 「发了 DNT: 1 站点就必须遵守」——没有约束力,也没惩罚。
- 「DNT 值可以随便写」——只认 0 和 1,别的按未表态处理。
自测三问(点开对答案)
1. `DNT` 的两个合法值是什么? —— `1` 表示不想被跟踪,`0` 表示不介意。 2. 为什么它最终失败了? —— 全靠自愿:发不发看浏览器、听不听看站点、没有强制力和惩罚。 3. 现在限制跟踪靠什么? —— 法规(GDPR 那类事先同意)和技术(分区 cookie、默认拦第三方)。最后一个字段更彻底:它连「谁来看」这件事都已经没有实现者了。
- ☐ (本节完,下一节 6.8.4 P3P)