咱們知道,當用戶發送一個http請求的時候,瀏覽的的版本信息也包含在了http請求信息中:php
如上圖所示,請求 google plus 請求頭就包含了用戶的瀏覽器信息:html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
咱們能夠經過服務器端語言提供的相關API獲取客戶端的瀏覽器信息,進而對不一樣的瀏覽器返回不一樣的html文檔,這樣就能夠針對現代瀏覽器返回絢麗的展現頁面了。web
而在Javascript中咱們也提供了相關的API獲取當前瀏覽器的信息:chrome
navigator.userAgent
userAgent中提供給了瀏覽器將要發送給服務器端的http請求頭中user-agent的信息。獲取到這個信息以後咱們能夠經過正則匹配獲取到瀏覽器和版本信息:windows
//獲取瀏覽器發送的userAgent信息 var userAgentInfo = navigator.userAgent.toLowerCase(); document.write(userAgentInfo + '<br />'); /** * 輸出運行的瀏覽器信息: * Chrome: mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.94 safari/537.36 * IE10: mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.94 safari/537.36 */ // 經過正則匹配獲取瀏覽類型和版本 // 例如能夠這樣獲取IE的 var agent = {}; if (window.ActiveXObject) agent.ie = userAgentInfo.match(/msie ([\d.]+)/)[1]; // 下面就輸出信息 if(agent.ie) document.write(agent.ie); // IE瀏覽器下輸出瀏覽下版本號,其餘瀏覽器沒有輸出信息
在PHP中也提供了相關的API:瀏覽器
strpos() 函數返回字符串在另外一個字符串中第一次出現的位置。 若是沒有找到該字符串,則返回 false。
$_SERVER 中存放着不少服務器的變量,其中$_SERVER['HTTP_USER_AGENT'] #當前請求的 User_Agent: 頭部的內容。
能夠像下面這樣判斷請求者的瀏覽器和版本,注意,這裏的版本能夠是訪問者僞造的,不必定正確。服務器
<?php if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE8.0")) echo"IE8.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE7.0")) echo"IE7.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE6.0")) echo"IE6.0"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/17")) echo"Firefox17"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/16")) echo"Firefox16"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome")) echo"Chrome"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Safari")) echo"Safari"; elseif(strpos($_SERVER["HTTP_USER_AGENT"],"Opera")) echo"Opera"; else echo$_SERVER["HTTP_USER_AGENT"]; ?>
此外還可使用條件註釋語句:網絡
條件註釋 (conditional comment) 是於HTML源碼中被 Microsoft Internet Explorer 有條件解釋的語句。條件註釋可被用來向 Internet Explorer 提供及隱藏代碼。app
條件註釋最初於微軟的 Internet Explorer 5瀏覽器中出現,而且直至 Internet Explorer 9 均支持。[1]微軟已宣佈於 Internet Explorer 10 中以標準模式處理頁面 - 如 HTML5 - 時中止支持,可是舊版網頁使用這種技術(於兼容性視圖)將繼續有效。ide
<!--[if !IE]><!--> 除IE外均可識別 <!--<![endif]--> <!--[if IE]> 全部的IE可識別 <![endif]--> <!--[if IE 6]> 僅IE6可識別 <![endif]--> <!--[if lt IE 6]> IE6如下版本可識別 <![endif]--> <!--[if gte IE 6]> IE6以及IE6以上版本可識別 <![endif]--> <!--[if IE 7]> 僅IE7可識別 <![endif]--> <!--[if lt IE 7]> IE7如下版本可識別 <![endif]--> <!--[if gte IE 7]> IE7以及IE7以上版本可識別 <![endif]--> <!--[if IE 8]> 僅IE8可識別 <![endif]--> <!--[if IE 9]> 僅IE9可識別 <![endif]-->
網絡爬蟲的爬取問題
接下來可能會遇到的就是網絡爬蟲的爬取問題,咱們應該給爬蟲返回怎樣的頁面才能保證給爬蟲提供的頁面最適合於網站的SEO呢。其實爬蟲請求頭中的User-Agent也包含了特殊的標記信息,咱們獲取到該信息判斷是否爬蟲,而後返回最佳的SEO頁面就能夠了。
網絡爬蟲在發送http請求獲取網頁數據時也會在頭部附加 User-Agent信息,特別注意的一點就是有些野蜘蛛 User-Agent信息爲空,這樣就須要在程序中作是否爲空的判斷,防止robots.txt 文件也對它的限制無效,致使不斷的爬去你的網站。
能夠向下面這樣,判斷到訪問者的User-Agent爲空,則返回404:
<?php $flag = false; $ua = $SERVER['HTTP_USER_AGENT']; if($ua == ''){ $flag = true; } if($flag){ header('HTTP/1.1 404 Not Found'); header("status: 404 Not Found"); echo '您的請求未經過咱們的驗證!'; exit(); } ?>
咱們網站的流量主要是從哪幾個搜索引擎獲取的呢,這裏是IT宅的的一份統計數據:
咱們能夠看到主要是來自如下幾個搜索引擎:
www.baidu.com www.google.com so.360.cn
下面是官方給出的一些user agent信息:
百度:http://www.baidu.com/search/spider.htm google:https://support.google.com/webmasters/answer/1061943 360:http://www.so.com/help/help_3_2.html soso:http://help.soso.com/webspider.htm sogou:http://www.sogou.com/docs/help/webmasters.htm#07
因此咱們須要匹配的userAgent關鍵字以下:
Baiduspider
Googlebot
360Spider
Sosospider
sogou spider
以下函數便可判斷是否屬於上面所列舉的spider:
<?php function isSpider(){ $ua = strtolower($_SERVER['HTTP_USER_AGENT']); if(!empty($ua)){ $spiderAgentArr = array( "Baiduspider", "Googlebot", "360Spider", "Sosospider", "sogou spider" ); foreach($spiderAgentArr as $val){ $spiderAgent = strtolower($val); if(strpos($ua, $spiderAgent) !== false){ return true; } } return false; } else { return false; } } echo $_SERVER['HTTP_USER_AGENT']; if(isSpider()){ echo '爬蟲正在訪問網站'; } else { echo '不是爬蟲訪問網站'; } ?>
因此咱們能夠這樣根據不一樣的訪問用戶提供不一樣的響應結果。
咱們能夠模擬一下百度的網絡爬蟲爬取數據,咱們在Chrome中模擬一下:
訪問以後能夠發現返回了須要的結果:
(轉自:http://www.itzhai.com/http-request-user-agent-determines-the-type-of-browser-requests-a-variety-of-ways-web-crawler-marked.html)