核心邏輯
- 取得
$_SERVER['HTTP_REFERER']。
- 判斷來源域名(Google、Baidu 等)。
- 依各引擎查詢參數名(
q、wd)提取關鍵字。
urldecode() 解碼,必要時轉換編碼(Baidu 為 GBK)。
完整實作
<?php
function getSearchKeyword()
{
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
if (!$referer) return '';
$engines = [
'google' => ['domain' => 'google.com', 'param' => 'q', 'charset' => 'UTF-8'],
'baidu' => ['domain' => 'baidu.com', 'param' => 'wd', 'charset' => 'GBK'],
'bing' => ['domain' => 'bing.com', 'param' => 'q', 'charset' => 'UTF-8'],
'sogou' => ['domain' => 'sogou.com', 'param' => 'query', 'charset' => 'UTF-8'],
];
foreach ($engines as $name => $conf) {
if (stripos($referer, $conf['domain']) !== false) {
$kw = extractParam($referer, $conf['param']);
if ($kw) {
$kw = urldecode($kw);
if (strtoupper($conf['charset']) !== 'UTF-8') {
$kw = mb_convert_encoding($kw, 'UTF-8', $conf['charset']);
}
return ['engine' => $name, 'keyword' => $kw];
}
}
}
return '';
}
function extractParam($url, $param)
{
$start = stripos($url, $param.'=');
if ($start === false) return '';
$start += strlen($param) + 1;
$end = strpos($url, '&', $start);
return $end ? substr($url, $start, $end-$start) : substr($url, $start);
}
// 使用
$result = getSearchKeyword();
if ($result) {
echo "來自 {$result['engine']} 搜尋:{$result['keyword']}";
}
?>
注意事項
HTTP_REFERER 可被偽造或被瀏覽器/防火牆攔截,不可作為安全依據。
- HTTPS → HTTP 導航時瀏覽器不發送 Referer。
- 現代搜尋引擎多改用 POST 或加密參數,關鍵字獲取率逐年下降。
- 建議改用站內搜尋記錄、Google Search Console API 或 UTM 參數追蹤來源。