多语言判断用户是否启用了请勿追踪(Do Not Track)

请勿追踪(英语:Do Not Track,简称 DNT,又译为“请勿跟踪”)是一项被提名的 HTTP 头。当用户提出启用“请勿追踪”功能后,具有“请勿追踪”功能的浏览器会在 http 数据传输中添加一个“头信息”(headers),这个头信息向商业网站的服务器表明用户不希望被追踪。这样,遵守该规则的网站就不会追踪用户的个人信息来用于更精准的在线广告。

自 Firefox 浏览器成为世界上首个支持“请勿追踪”功能的浏览器后,Internet Explorer(9及以上)、Safari 和 Opera 浏览器也相继添加了对“请勿追踪”功能的支持。最后 Chrome 23 浏览器也宣布支持此功能。当前,国内许多浏览器也已经支持了“请勿追踪”功能,甚至一些浏览器设置成默认启用。

那么,身为网站技术人员或开发者,我们若要遵守该规则,就需要判断用户的浏览器是否开启了这个功能。其思路为,判断 HTTP 头信息中是否含有 HTTP-DNT 参数。有的话,获得其值,进行判断,进而就能判断“请勿追踪”的开启与否了。

Donottrack.us 给我们提供了各种语言的完全代码:

ASP (VBScript)

<?
Dim DoNotTrackHeader
DoNotTrackHeader = "DNT"
Dim DoNotTrackValue
DoNotTrackValue = "1"

Dim aspHeader
aspHeader = "HTTP_" & UCase(Replace(DoNotTrackHeader, "-", "_"))

Dim headerValue
headerValue = Request.ServerVariables(aspHeader)

If (Not IsNull(headerValue)) And (headerValue = DoNotTrackValue) Then
   // 用户启用了请勿追踪
Else
   // 用户没有启用请勿追踪
End If
?>

Java Servlet / JSP

String DoNotTrackHeader = "DNT";
String DoNotTrackValue = "1";

// 需要用到 javax.servlet.http.HttpServletRequest
String headerValue = request.getHeader(DoNotTrackHeader);

if((headerValue != null) && headerValue.equals(DoNotTrackValue))
{
   // 用户启用了请勿追踪
}
else
{
   // 用户没有启用请勿追踪
}

Perl CGI

$DoNotTrackHeader = "DNT";
$DoNotTrackValue = "1";

$perlHeader = "HTTP_" . strtoupper(str_replace("-", "_", $DoNotTrackHeader));

if((exists $ENV{$perlHeader}) and ($ENV{$perlHeader} == $DoNotTrackValue))
{
   // 用户启用了请勿追踪
}
else
{
   // 用户没有启用请勿追踪
}

PHP

<?php
  $DoNotTrackHeader = "DNT";
  $DoNotTrackValue = "1";

  $phpHeader = "HTTP_" . strtoupper(str_replace("-", "_", $DoNotTrackHeader));

  if((array_key_exists($phpHeader, $_SERVER)) and ($_SERVER[$phpHeader] == $DoNotTrackValue))
  {
         // 用户启用了请勿追踪
  }

  else
  {
        // 用户没有启用请勿追踪
  }
?>

Python (Django)

DoNotTrackHeader = "DNT"
DoNotTrackValue = "1"

pyHeader = "HTTP_" + DoNotTrackHeader.replace("-", "_").upper()

# 需要 HttpRequest
if (pyHeader in request.META) and (request.META[pyHeader] == DoNotTrackValue):
   # 用户启用了请勿追踪
else:
   # 用户没有启用请勿追踪

PHP 优化版

可以看到,上面的代码还有很大的精简空间。

并且,Firefox 支持告诉网站“我想被追踪”,当用户使用这个选项时,浏览器会表示 HTTP_DNT: 0。加上这条信息,我们可以以 PHP 为例,得出优化版本:

<?php
/* 优化版开始 */
  if((array_key_exists('HTTP_DNT', $_SERVER))){
     switch($_SERVER['HTTP_DNT']){
        case '1':
          // 用户不愿被追踪!
          break;
        case '0':
          // 用户很愿意被追踪啊~
          break;
        default:
          // 用户意愿表达有误。
     }
  }else{
     // 用户没有表达意愿。
  }
/* 优化版结束 */
?>

至于其他语言的代码,我相信你们定能依葫芦画瓢的。我就不轻举妄动,乱装权威了。

JavaScript

至少我是找不到用 JavaScript 读出我想要的东西的方法了,其读出来的所谓的“HTTP 头信息”不完整,很多东西都是用其它属性实现的;JavaScript 的属性具有“多样性”——对,是不是有专门的属性来判断“请勿追踪”呢?我终于找到了这个属性,但还是让我大失所望。

首先,火狐运行这 JavaScript 代码,“我想被追踪”也会被判为“我不想被追踪”(这个 BUG 将在 32 版本中得到修复);其次,Chrome 似乎不支持该属性;再一个,navigator.doNotTrack 的值并不是 HTTP 请求中 do-not-track 请求头的值,然而 IE9、Opera 12和 Safari 5.1 遵循了旧规范,navigator.doNotTrack 的值就是 do-not-track 请求头中的值;最后,Internet Explorer 使用专门的 navigator.msDoNotTrack 属性。

因此在此就不列出代码了。若要实现我们想实现的,必定会要写一大坨的。建议不要使用 JavaScript 来判断,可以变通一下,使用上面 5 种语言的其中一种判断后,定义一个 JavaScript 变量,给它赋值,然后下面就能判断了。

当然,如果你实在有兴趣写一大坨代码,可以使用下面的链接了解这两个 JavaScript 属性:navigator.doNotTrack | navigator.msDoNotTrack

“请勿追踪”让互联网更美好

如果网站都遵守这个规则,互联网可以变得更美好。

英文好的人需要进一步了解的话,可以查看 donottrack.us维基百科的“请勿追踪”词条也是不错的选择,不过请看英文版,中文版的简介就是本文第一段。

2014-7-31 P.S.更新火狐 BUG 修正信息。

2018-7-19 P.S.有关 JavaScript 的实现可以阅读新文章《用 JavaScript 判断用户是否启用了请勿追踪(DNT)》。

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/291/

12 条评论

  1. 你以为你要我给你沙发我就给你沙发啊,啊?

    1. 我是说请你指教下啦!你不是会一点那啥东东么?……

  2. Do Not Track Coxxs

    1. ERROR:Computer Cannot Read Your Code

      1. Coxxs.DNT = 1;

        1. The website does not support Do Not Track,haha...

          1. Coxxs.Destroy();

            1. ERROR:Cannot call function Coxxs.Destroy() on Line 12;

            2. QAQ我输了..
              exit(0);

            3. ERROR:Computer Cannot Read Your Code "QAQ我输了.."

  3. GW GW

    纯属路过,教我怎么防盗链

    1. 网上一搜一大堆啊,一般使用 .htaccess 实现。可参考:http://shansing.com/read/51/

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情