單純要判斷是否為搜尋引擎的 bot,是可以用 user agent 來判斷。不需要把所有的 bot 名稱都記下來,判斷有沒有+http 的字串即可,列如:
- Bing: Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
- Google Bot: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
- Google Mobile Bot: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
但是 Adsense 的 bot 例外,user agent 是 Mediapartners-Google
目前我們找到更簡單的方法是,判斷是否有 Accept-Language 。以我的 Chrome 為列,我的 request header 的 accept language 是 zh-TW,en-US;q=0.8,en;q=0.6,zh-CN;q=0.4 。在多國語系的網頁中,Accept Language 常被用來決定網頁內容要呈現何種語言,Accept Language 每一個國家地區都不一樣,所以通常 bot 是不會使用的。
這邊列表了 google bot, google mobile bot, curl, wget, facebook crawler, google plus one crawler, google page speed 等 bot 的 request header:https://gist.github.com/girvan/6017328
以 PHP 來說,我的做法是這樣子
define('IS_BOT', !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']));