首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 解析搜尋引擎來路關鍵字:支援 Google、百度、Bing 等主流引擎

     編輯:PHP 綜合知識

應用場景

分析網站流量來源、關鍵字排名追蹤、個性化推薦內容、SEO 效果評估。

核心邏輯

  1. 取得 $_SERVER['HTTP_REFERER'] 或傳入的 URL 參數。
  2. 匹配已知搜尋引擎域名(google.com、baidu.com、bing.com 等)。
  3. 依引擎特定的查詢參數名(q、wd、query)提取關鍵字。
  4. 處理編碼轉換(UTF-8 → 系統內碼),輸出結構化結果。

完整實作代碼

<?php
/**
 * 從 Referer URL 解析搜尋引擎與關鍵字
 * @param string $url 完整 Referer URL
 * @return array ['engine' => 'google', 'keywords' => ['關鍵字1', '關鍵字2']]
 */
function parseSearchEngineKeywords(string $url): array
{
    $engines = [
        'google.com'     => ['param' => 'q',      'charset' => 'UTF-8'],
        'google.com.tw'  => ['param' => 'q',      'charset' => 'UTF-8'],
        'google.com.hk'  => ['param' => 'q',      'charset' => 'UTF-8'],
        'baidu.com'      => ['param' => 'wd',     'charset' => 'GBK'],
        'sogou.com'      => ['param' => 'query',  'charset' => 'GBK'],
        'so.com'         => ['param' => 'q',      'charset' => 'UTF-8'], // 360搜尋
        'bing.com'       => ['param' => 'q',      'charset' => 'UTF-8'],
        'yahoo.com'      => ['param' => 'p',      'charset' => 'UTF-8'],
        'duckduckgo.com' => ['param' => 'q',      'charset' => 'UTF-8'],
        'yandex.com'     => ['param' => 'text',   'charset' => 'UTF-8'],
    ];

    $parsed = parse_url($url);
    if (empty($parsed['host']) || empty($parsed['query'])) {
        return ['engine' => 'unknown', 'keywords' => []];
    }

    $host = strtolower($parsed['host']);
    // 移除 www. 前綴以便匹配
    $host = preg_replace('/^www\./', '', $host);

    foreach ($engines as $domain => $config) {
        // 精確匹配域名或子域名
        if (strpos($host, $domain) !== false && (strlen($host) === strlen($domain) || substr($host, -strlen($domain)-1) === '.'.$domain)) {
            $param = $config['param'] . '=';
            $query = $parsed['query'];

            // 提取參數值
            $start = strpos($query, $param);
            if ($start === false) {
                return ['engine' => $domain, 'keywords' => []];
            }
            $start += strlen($param);
            $end = strpos($query, '&', $start);
            $keywordEncoded = $end !== false ? substr($query, $start, $end - $start) : substr($query, $start);

            // URL 解碼
            $keyword = urldecode($keywordEncoded);

            // 編碼轉換
            if (strtoupper($config['charset']) !== 'UTF-8') {
                $keyword = @iconv($config['charset'], 'UTF-8//IGNORE', $keyword);
            }

            // 分割多關鍵字(以空白或 + 分隔)
            $keywords = preg_split('/\s+|\+/', trim($keyword), -1, PREG_SPLIT_NO_EMPTY);

            return ['engine' => $domain, 'keywords' => $keywords];
        }
    }

    return ['engine' => 'unknown', 'keywords' => []];
}

// 使用範例
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$result = parseSearchEngineKeywords($referer);
echo "引擎: {$result['engine']}\n";
echo "關鍵字: " . implode(', ', $result['keywords']) . "\n";
?>

關鍵技術點解析

課題處理方式
域名匹配使用 strpos + 邊界檢查,避免 baidu.com.evil.com 誤判
參數提取手動解析 Query String,比 parse_str 更精確控制單一參數
編碼轉換百度/搜狗常用 GBK,需 iconv 轉 UTF-8,//IGNORE 忽略非法字元
關鍵字分割支援空白、+、全形空白等分隔符
HTTPS Referer 缺失現代瀏覽器跨域 HTTPS→HTTP 不送 Referer,需配合 Search Console / 站長平台數據

進階擴充建議

  • 快取機制:對同一 Referer 緩存解析結果,減少重複運算。
  • 資料庫記錄:儲存 engine, keyword, landing_page, timestamp, user_id 供後續分析。
  • 支援站內搜尋:若網站有內部搜尋,同樣記錄關鍵字,補全使用者意圖圖譜。
  • 語意分析:結合 Jieba 中文分詞、同義詞擴展,提升關鍵字聚類準確度。

結語

雖然 HTTPS 普及導致 Referer 關鍵字獲取越來越困難,但對於仍有 HTTP 流量或配合站長工具數據的場景,此解析邏輯依然實用。建議搭配 Google Search Console API、百度站長平台 API 獲取更完整的搜尋關鍵字數據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved