谷歌分析實際上有一個從任意來源發送分析數據的協議。看到這裏:https://developers.google.com/analytics/devguides/collection/protocol/v1/
因此,讓您的網絡服務器發送一個分析事件給谷歌並不像看起來那麼可笑。我不確定是否可以直接鉤入Apache來生成這些事件。不過,我確實看到至少有兩種解決方案。
1)將所有下載重定向到發送數據並可以生成所需分析事件的服務器端腳本。
2)解析服務器日誌並從中生成分析事件。用於解決方案1
編輯示例:
一定要確保有之前或之後的標籤,因爲這將是發送給客戶端的實際反應的一部分沒有空格。
的download.php:
<?php
// Read ?file=xxx URL parameter
$requestedFile = $_GET["file"];
// Read Google Analytics cookie
$rawCookie = $_COOKIE["_ga"];
$splitCookie = explode('.', $rawCookie);
$trackingId = $splitCookie[2] . '.' . $splitCookie[3];
// Create Google Analytics request data (see here https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide)
$data = array('v' => 1,
'tid' => 'UA-XXXXX-Y',
'cid' => $trackingId,
't' => 'event',
'ec' => 'download',
'ea' => 'download',
'el' => $requestedFile);
// Create the request options
$options = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
// Send GA request
$result = file_get_contents('https://www.google-analytics.com/collect', false, $context);
// GA request failed
if($result === FALSE) { /* Error */ }
// Requested file does not exist
if(!file_exists($requestedFile)) { /* Error */ }
// Set response headers for binary data
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($requestedFile));
// Open the requested file
$fileHandle = fopen($requestedFile, 'r');
// Write the requested file to stdout (which is what the client receives)
print fread($fileHandle, filesize($requestedFile));
flush();
// Close the requested file again
fclose($fileHandle);
exit;
?>
。htaccess的/ mod_rewrite的規則:
RewriteEngine on
RewriteUrl ^/download/(.*)$ download.php?file=$1 [L]
不是它一直年齡,因爲我寫我的最後一個PHP代碼,我沒有測試這一點。但它應該給如何實現選項1)
編輯2:如果您將跟蹤請求發送到www.google-analytics.com/debug/collect,您將收到一些驗證信息,告訴您是否您的請求是否有效(但它不會跟蹤事件)。
編輯3: 好了,所以我與使用analytics.js的頁面進行檢查。該腳本設置了以下Cookie:
_ga=GA1.3.1788966449.1501761573
_gid=GA1.3.1010429060.1501761573
後來在收集請求它設置
cid:1788966449.1501761573
_gid:1010429060.1501761573
所以好像你需要做的與你在_ga餅乾查找有點字符串分割。 (我已經更新上述代碼)
EDIT 4:如果任何人的疑惑,這與上面提到的Cookie值在analytics.js腳本生成該請求。
GET https://www.google-analytics.com/collect?v=1&_v=j56&a=1178408574&t=pageview&_s=1&dl=https%3A%2F%2Fdevelopers.google.com%2Fanalytics%2Fdevguides%2Fcollection%2Fanalyticsjs%2Fcommand-queue-reference&ul=de&de=UTF-8&dt=The%20ga%20Command%20Queue%20Reference%20%C2%A0%7C%C2%A0%20Analytics%20for%20Web%20(analytics.js)%20%C2%A0%7C%C2%A0%20Google%20Developers&sd=24-bit&sr=1920x1200&vp=1899x1072&je=0&_u=QDCAAAIhI~&jid=&gjid=&cid=1788966449.1501761573&tid=UA-41425441-2&_gid=1010429060.1501761573&z=1116872044
感謝。我目前正在解析服務器日誌,但這很難手動提取信息。然後,將這些信息發送給GA更加困難。要有一個完整的自動化解決方案看起來很複雜(腳本從服務器日誌+ GA API中提取信息,將這些數據發送到GA +'cron'作業等)。我想應該有一個更簡單的解決方案,因爲*這是一個非常普遍的情況,想跟蹤網站上的下載?*非程序員博客誰想跟蹤他們給的免費PDF下載? – Basj
1)聽起來不錯。你可以提供更多的信息,它將如何工作? – Basj
Apache提供了mod_rewrite,它允許在客戶端沒有注意到的情況下重寫服務器上的URL。所以你可以把/downloads/cool.zip改寫成/download.php?file=cool.zip。然後,PHP腳本可以讀取文件參數,與Google Analytics交談併發送用戶請求的文件。 或者,而不是給直接下載鏈接到你的用戶,你可以發送出/download.php?file=something鏈接這將不需要任何服務器端URL重寫。 –