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

PHP 判斷請求來源是否為搜尋引擎機器人:User-Agent 白名單快速識別法

     編輯:PHP 相關知識

PHP 快速識別搜尋引擎爬蟲:陣列比對法與實戰封裝

需針對真實使用者與爬蟲呈現不同內容(如 SEO 渲染、隱藏廣告)?本文提供高效 PHP 判斷函式,透過 User-Agent 關鍵字陣列比對,回傳引擎名稱或布林值。

核心判斷函式

<?php
class BotDetector {
    private static $engines = [
        'google'        => ['googlebot', 'mediapartners-google', 'adsbot-google'],
        'bing'          => ['bingbot', 'msnbot'],
        'baidu'         => ['baiduspider'],
        'yandex'        => ['yandexbot'],
        'sogou'         => ['sogou web spider', 'sogou push spider'],
        '360'           => ['360spider', 'haosouspider'],
        'yahoo'         => ['yahoo! slurp', 'yahoo! slurp china'],
        'duckduckgo'    => ['duckduckbot'],
        'facebook'      => ['facebookexternalhit'],
        'twitter'       => ['twitterbot'],
        'linkedin'      => ['linkedinbot'],
        'telegram'      => ['telegrambot'],
        'whatsapp'      => ['whatsapp'],
        'slack'         => ['slackbot'],
    ];

    public static function detect(): ?string {
        $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
        if (!$ua) return null;

        foreach (self::$engines as $name => $keywords) {
            foreach ($keywords as $kw) {
                if (strpos($ua, $kw) !== false) return $name;
            }
        }
        return null;
    }

    public static function isBot(): bool {
        return self::detect() !== null;
    }
}

// 使用範例
if (BotDetector::isBot()) {
    $engine = BotDetector::detect();
    echo "來自 $engine 爬蟲";
    // 輸出精簡 HTML、不載入廣告、不統計 GA 等
} else {
    echo "真實使用者";
    // 完整頁面、載入廣告、統計分析
}
?>

進階:支援自訂規則與快取

class BotDetector {
    // ... 略 ...

    public static function detectWithCache(): ?string {
        $cacheKey = 'bot_detect_' . md5($_SERVER['HTTP_USER_AGENT'] ?? '');
        // 假設使用 Redis/APCu
        if (apcu_exists($cacheKey)) return apcu_fetch($cacheKey);

        $result = self::detect();
        apcu_store($cacheKey, $result, 3600); // 快取 1 小時
        return $result;
    }
}

常見應用場景

場景處理方式
SEO 動態渲染爬蟲回傳預渲染 HTML,使用者回傳 SPA
隱藏敏感資訊爬蟲不顯示電話、Email、價格等
分析統計排除GA、Matomo 等排除已知 Bot 流量
頻率限制差異爬蟲給予較寬鬆 Rate Limit
內容版本控制爬蟲看到舊版快取,使用者看到新版

注意事項

  • User-Agent 可偽造,嚴格場景需配合 IP 反向查詢驗證(如 Googlebot 驗證 *.googlebot.com)。
  • 關鍵字清單需定期更新,新搜尋引擎層出不窮。
  • 避免在判斷邏輯中執行耗時操作(如 DNS 查詢),影響回應速度。
  • 若使用 CDN(Cloudflare 等),可直接讀取 CF-IPCountry、CF-Connecting-IP 等標頭輔助判斷。

擴充:整合至主流框架

  • Laravel:建立 Middleware DetectBot,將 $request->attributes->set('is_bot', BotDetector::isBot())。
  • Symfony:Event Listener KernelEvents::REQUEST 註入屬性。
  • ThinkPHP:中介軟體 BotDetect。
  • 原生 PHP:require 'BotDetector.php'; 於入口檔頂部引入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved