從 $_SERVER['HTTP_REFERER'] 取得來路 URL,依搜尋引擎域名判斷來源,再解析查詢參數中的關鍵字鍵名(如 wd、q、query),最後依引擎編碼轉為網站編碼(通常 UTF-8)。
| 引擎 | 域名關鍵字 | 查詢參數 | 原始編碼 |
|---|---|---|---|
| google.com / google.cn | q | UTF-8 | |
| 百度 | baidu.com | wd / word | GBK |
| 雅虎 | yahoo.cn | p | UTF-8 |
| 搜狗 | sogou.com | query | GBK |
| 搜搜 | soso.com | w | GBK |
| 必應 | bing.com | q | UTF-8 |
| 有道 | youdao.com | q | UTF-8 |
<?php
/**
* 從 Referer 解析搜尋引擎關鍵字
* @return array ['engine' => 引擎名, 'keyword' => UTF-8 關鍵字, 'raw' => 原始 Referer]
*/
function parseSearchKeyword() {
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (!$referer) return ['engine' => 'direct', 'keyword' => '', 'raw' => ''];
$engines = [
['name' => 'Google', 'domain' => 'google.', 'param' => 'q', 'enc' => 'UTF-8'],
['name' => 'Baidu', 'domain' => 'baidu.', 'param' => 'wd', 'enc' => 'GBK'],
['name' => 'Baidu', 'domain' => 'baidu.', 'param' => 'word', 'enc' => 'GBK'],
['name' => 'Yahoo', 'domain' => 'yahoo.', 'param' => 'p', 'enc' => 'UTF-8'],
['name' => 'Sogou', 'domain' => 'sogou.', 'param' => 'query', 'enc' => 'GBK'],
['name' => 'Soso', 'domain' => 'soso.', 'param' => 'w', 'enc' => 'GBK'],
['name' => 'Bing', 'domain' => 'bing.', 'param' => 'q', 'enc' => 'UTF-8'],
['name' => 'Youdao', 'domain' => 'youdao.', 'param' => 'q', 'enc' => 'UTF-8'],
['name' => '360', 'domain' => 'so.', 'param' => 'q', 'enc' => 'UTF-8'],
['name' => 'Shenma', 'domain' => 'sm.cn', 'param' => 'q', 'enc' => 'UTF-8'],
];
foreach ($engines as $e) {
if (stripos($referer, $e['domain']) !== false) {
// 解析查詢字串
$queryStart = stripos($referer, $e['param'] . '=');
if ($queryStart !== false) {
$queryStart += strlen($e['param']) + 1;
$queryEnd = strpos($referer, '&', $queryStart);
$keyword = $queryEnd ? substr($referer, $queryStart, $queryEnd - $queryStart) : substr($referer, $queryStart);
$keyword = urldecode($keyword);
if ($e['enc'] !== 'UTF-8') {
$keyword = mb_convert_encoding($keyword, 'UTF-8', $e['enc']);
}
return ['engine' => $e['name'], 'keyword' => $keyword, 'raw' => $referer];
}
}
}
return ['engine' => 'other', 'keyword' => '', 'raw' => $referer];
}
// 使用範例
$result = parseSearchKeyword();
if ($result['keyword']) {
echo "來源:{$result['engine']} | 關鍵字:{$result['keyword']}";
// 可存入 $_SESSION 或資料庫追蹤訂單來源
}
?>