通過解析 $_SERVER['HTTP_REFERER'] 中的查詢參數提取關鍵詞。各搜索引擎參數名不同:
| 搜索引擎 | 域名特徵 | 關鍵詞參數 |
|---|---|---|
| 百度 | baidu.com | wd / word |
| google.com / google.cn | q | |
| 360 搜索 | so.com | q |
| 搜狗 | sogou.com | query |
| 搜搜 | soso.com | w |
<?php
/**
* 解析搜索引擎來路關鍵詞
* @return array ['keyword' => string, 'engine' => string]
*/
function getSearchKeyword(): array {
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$keyword = '';
$engine = '';
if (empty($referer)) {
return ['keyword' => '', 'engine' => ''];
}
// 百度
if (strpos($referer, 'baidu.com') !== false) {
if (preg_match('/[?&]wd=([^&]+)/i', $referer, $m) ||
preg_match('/[?&]word=([^&]+)/i', $referer, $m)) {
$keyword = urldecode($m[1]);
}
$engine = 'baidu';
}
// Google
elseif (strpos($referer, 'google.') !== false) {
if (preg_match('/[?&]q=([^&]+)/i', $referer, $m)) {
$keyword = urldecode($m[1]);
}
$engine = 'google';
}
// 360
elseif (strpos($referer, 'so.com') !== false) {
if (preg_match('/[?&]q=([^&]+)/i', $referer, $m)) {
$keyword = urldecode($m[1]);
}
$engine = '360';
}
// 搜狗
elseif (strpos($referer, 'sogou.com') !== false) {
if (preg_match('/[?&]query=([^&]+)/i', $referer, $m)) {
$keyword = urldecode($m[1]);
}
$engine = 'sogou';
}
// 搜搜
elseif (strpos($referer, 'soso.com') !== false) {
if (preg_match('/[?&]w=([^&]+)/i', $referer, $m)) {
$keyword = urldecode($m[1]);
}
$engine = 'soso';
}
return ['keyword' => $keyword, 'engine' => $engine];
}
// 使用示例
$result = getSearchKeyword();
if ($result['keyword']) {
echo "關鍵詞:{$result['keyword']} | 來源:{$result['engine']}";
}
strict-origin-when-cross-origin,跨域時僅傳送 Origin,關鍵詞參數丟失class SearchKeywordParser {
private static array $patterns = [
'baidu' => ['host' => 'baidu.com', 'params' => ['wd', 'word']],
'google' => ['host' => 'google.', 'params' => ['q']],
'360' => ['host' => 'so.com', 'params' => ['q']],
'sogou' => ['host' => 'sogou.com', 'params' => ['query']],
'soso' => ['host' => 'soso.com', 'params' => ['w']],
'bing' => ['host' => 'bing.com', 'params' => ['q']],
'yahoo' => ['host' => 'search.yahoo.', 'params' => ['p']],
'duckduckgo'=>['host'=>'duckduckgo.com', 'params' => ['q']],
];
public static function parse(string $referer = ''): array {
$referer = $referer ?: ($_SERVER['HTTP_REFERER'] ?? '');
foreach (self::$patterns as $engine => $conf) {
if (strpos($referer, $conf['host']) !== false) {
foreach ($conf['params'] as $param) {
if (preg_match('/[?&]' . $param . '=([^&]+)/i', $referer, $m)) {
return ['keyword' => urldecode($m[1]), 'engine' => $engine];
}
}
}
}
return ['keyword' => '', 'engine' => ''];
}
}