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

PHP 獲取搜索引擎來路關鍵詞完整實現 (百度/Google/360/搜狗/搜搜)

     編輯:PHP 相關知識

核心原理

通過解析 $_SERVER['HTTP_REFERER'] 中的查詢參數提取關鍵詞。各搜索引擎參數名不同:

搜索引擎域名特徵關鍵詞參數
百度baidu.comwd / word
Googlegoogle.com / google.cnq
360 搜索so.comq
搜狗sogou.comquery
搜搜soso.comw

完整函數實現

<?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']}";
}

現代挑戰與應對

  • HTTPS 加密:主流搜索引擎全站 HTTPS,Referer 政策預設 strict-origin-when-cross-origin,跨域時僅傳送 Origin,關鍵詞參數丟失
  • Referer Policy:目標站可設置 `` 嘗試獲取完整 Referer,但受搜索引擎端控制
  • 替代方案:
    1. 站長平台/搜索資源平台 API 獲取搜索詞數據 (百度站長、Google Search Console)
    2. 站內搜索記錄用戶輸入
    3. UTM 參數追蹤推廣鏈接

增強版:支援更多引擎與緩存

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' => ''];
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved