咱们知道,当用户发送一个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)