跳转到主要内容
dustise 提交于 22 September 2014

译者吐槽:我觉得这个办法挺2的。

 

最近一个客户的项目需要进行一项跟踪:最近一段时间里,用户的注册过程中是否会看到一个升级注册的广告。如果用户点击了这个广告并且立即完成注册,那没什么好做的,用Google自定义跟踪代码就满足需求了。

如果使用Cookie来解决这个问题,会非常的简单。然而,我们的注册过程是在spacetowel.com,广告却运行在 luxurycement.com,因为跨域安全的问题,我们无法访问其他域名下的Cookie。(这一规则是用于防止其他站点获取不属于本站的Cookie信息)。

既然我们无法获取 luxurycement.com, 的Cookie信息,spacetowel.com需要在 luxurycement.com 上做一点手脚。跟踪像素一般是一个1x1的gif图片。因为客户浏览器向服务器提交了这个载入图片的请求,我们可以在这一时机加入cookie,用于后续的读取。有了这个Cookie,我们对注册过程中广告是否出现的检测和跟踪就很容易了。

在Drupal中提供一个跟踪像素功能非常简单。首先注册一个page callback:

/**
 * Implements hook_menu().
 */
function dm_tracking_pixel_menu() {
  $items = array();

  $items['track.gif'] = array(
    'page callback' => 'dm_tracking_pixel_gif',
    'file' => 'dm_tracking_pixel.pages.inc',
    'access arguments' => array('access tracking pixel'),
  );

  return $items;
}

上面的代码让 spacetowel.com/track.gif 返回一个图片,有趣的是这个callback的执行内容,这一方法来自于Stack Overflow

<?php

/**
 * Page callback for showing a simple tracking pixel.
 */
function dm_tracking_pixel_gif() {
  ignore_user_abort(true);

  // Ensure the tracking pixel is always served by Drupal so the cookie is set.
  drupal_page_is_cacheable(FALSE);

  // Store the last time they saw an ad.
  $cookie_data = array();
  // Set some data you want to store here, and then set the cookie.
  user_cookie_save($cookie_data);

  if (function_exists('apache_setenv')) {
    apache_setenv('no-gzip', 1);
  }
  ini_set('zlib.output_compression', 0);
  if (ob_get_level() == 0) {
    ob_start();
  }
  drupal_add_http_header('Content-encoding', 'none');
  drupal_add_http_header('Content-type', 'image/gif');
  drupal_add_http_header('Content-Length', '42');
  drupal_add_http_header('Cache-Control', 'private, no-cache, no-cache=Set-Cookie, proxy-revalidate');
  drupal_add_http_header('Expires', 'Wed, 11 Jan 2000 12:59:00 GMT');
  drupal_add_http_header('Last-Modified', 'Wed, 11 Jan 2006 12:59:00 GMT');
  drupal_add_http_header('Pragma', 'no-cache');
  // 这就是图片,不需要GD
  echo sprintf('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%',71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0,2,2,68,1,0,59);
  ob_flush();
  flush();
  ob_end_flush();

  drupal_exit();
}

最后要确认你的ad团队在广告中添加对这个跟踪像素的引用。

Drupal 版本