end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

webサーバのログにユーザの外部サイトへの移動を記録

外部サイト→内部サイトの移動はリファラーを参照

ユーザの自サイトへ移動元は、アクセルログのリファラーを見れば一目瞭然です。例えば、ログに対して次のように表示されていれば、ユーザの移動元は www.google.co.jp であることが分かります。

127.0.0.1 - - [13/Sep/2008:18:27:01 +0900]
   "GET /index.html HTTP/1.1" 200 107
   "http://www.google.co.jp" "<略>" 0

※実際は1行です

内部→外部の移動は、Aタグに addEventListener()

内部サイト→外部サイトへ移動する際の記録は、AタグのClickを監視し、外部サイトへ移動する場合、前回のエントリと同様にXMLHttpRequest を利用することで実現できます。

http://d.hatena.ne.jp/end0tknr/20080913/1221295974

var REGEXP = new RegExp( "^"+ location.protocol +"//"+ location.host);
var RQST = getHttpRqst();

addListener(document, 'click', trackUserOut, false);

function trackUserOut(event) {

  var target;
  if (event) target = event.target;

  if (! target){ //for IE
    event = window.event;
    target = event.srcElement;
  }

  //Aタグによるページ遷移のみtrack
  if ( String.toUpperCase(target.tagName) != "A" ) return true;

  var href = target.href;
  //外部サイトへの移動を判断
  if ( href.match(REGEXP) ) return true;

  if (! RQST ) return true;

  //ダミーリクエスト(URL)の作成
  var url =
    location.protocol +"//"+ location.host + location.pathname +
    "?moveout=" + encodeURI(href);

  //ダミーリクエスト(URL)の送信
  RQST.open("POST", url);
  RQST.send(null);
  return true;
}

function addListener(elem, eventType, func, cap) {

  if(elem.addEventListener) { //for not IE
    elem.addEventListener(eventType, func, cap);
    return true;
  } 
  if(elem.attachEvent) { //for IE
    elem.attachEvent('on' + eventType, func);
    return true;
  }
  return false;
}

function getHttpRqst() {
  if(window.XMLHttpRequest) { //not IE
    return new XMLHttpRequest();
  }

  if(window.ActiveXObject) { //IE
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      return new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return null;
}