為了 SEO 分析,記錄使用者從搜尋引擎點擊進站時使用的關鍵字是常見需求。本文示範如何解析 $_SERVER['HTTP_REFERER'],識別主流搜尋引擎並提取查詢參數。
HTTP_REFERER(注意:用戶端可偽造、隱私模式可能為空)。parse_url() 拆解 URL,取得 host 與 query。parse_str() 將查詢字串轉為陣列。q、百度為 word)。<?php
function getSearchKeyword(): array {
$rfr = $_SERVER['HTTP_REFERER'] ?? '';
if (!$rfr) {
return ['keyword' => '', 'engine' => 'direct'];
}
$parts = parse_url($rfr);
if (!isset($parts['host'], $parts['query'])) {
return ['keyword' => '', 'engine' => 'unknown'];
}
parse_str($parts['query'], $queryParams);
$host = strtolower($parts['host']);
// 搜尋引擎域名 => 關鍵字參數名 對照表
$engineParams = [
'baidu.com' => 'wd', // 百度現用 wd,舊版 word
'google.com' => 'q',
'google.com.tw' => 'q',
'bing.com' => 'q',
'yahoo.com' => 'p',
'search.yahoo.com'=> 'p',
'so.com' => 'q', // 360 搜尋
'sogou.com' => 'query',
'duckduckgo.com' => 'q',
'yandex.com' => 'text',
'ask.com' => 'q',
];
$keyword = '';
$engine = 'other';
foreach ($engineParams as $domain => $param) {
if (strpos($host, $domain) !== false) {
$keyword = $queryParams[$param] ?? '';
$engine = $domain;
break;
}
}
// URL 解碼關鍵字(可能為編碼)
$keyword = urldecode($keyword);
return ['keyword' => $keyword, 'engine' => $engine];
}
// 使用範例
$result = getSearchKeyword();
if ($result['keyword']) {
echo "引擎: {$result['engine']}, 關鍵字: {$result['keyword']}<br>";
// 寫入資料庫
// $sql = "INSERT INTO visit_log (engine, keyword, visit_time) VALUES (?, ?, NOW())";
// $stmt = $pdo->prepare($sql);
// $stmt->execute([$result['engine'], $result['keyword']]);
} else {
echo '非搜尋引擎進站或無關鍵字<br>';
}
?>
word,現多用 wd,建議兩者皆檢查:$queryParams['wd'] ?? $queryParams['word']。strict-origin-when-cross-origin,同站會傳完整 URL,跨站僅傳來源域名(無查詢參數),導致無法取得關鍵字。此為瀏覽器隱私機制,無法從伺服器端解決。keyword、engine、landing_page、visit_time、user_agent,便後續分析。可維護一個設定檔 search_engines.php 回傳陣列,方便隨時新增/修改:
<?php // search_engines.php
return [
'google' => ['domains' => ['google.com', 'google.com.tw'], 'param' => 'q'],
'baidu' => ['domains' => ['baidu.com'], 'param' => ['wd', 'word']],
'bing' => ['domains' => ['bing.com'], 'param' => 'q'],
// ...
];
?>
主程式載入設定檔迴圈比對,提高維護彈性。