PHP自动判断客户端并进行301跳转
现在很多老版的网站都会有m站,在我们使用移动端访问时会自动跳转到m站,那么如何判断客户端设备是电脑还是手机或者是平板呢,有的使用的是js判断方式,以前我们使用的方式也是这样的,但是这样是损失资源的,因为js判断是在页面上进行的操作,这样就会有数据的请求。然后,获取完数据,判断设备类型,进行跳转,再次获取数据,渲染页面。浪费了很多资源,也加长了用户的等待时间。
js跳转流程图
那么,如何去避免这个问题,并且达到同样的效果呢,今天教大家一个方式。我们以thinkphp框架为例,版本为thinkphp5.0,在index.php(thinkphp框架的入口文件)文件内加入如下代码,此方式适用于有入口文件的框架。
//判断客户端并进行跳转 if(isset($_SERVER['HTTP_USER_AGENT'])) { $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); $clientkeywords = array('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-','philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu','android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini','operamobi', 'opera mobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'); if(preg_match("/(".implode('|',$clientkeywords).")/i",$userAgent)&&strpos($userAgent,'ipad') === false) { //手机站 $url = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $http = $_SERVER['HTTP_HOST']; if(substr($http, 0,3) == 'www'){ $newurl = str_replace('www.', 'm.', $url); header('HTTP/1.1 301 Moved Permanently'); header("location:$newurl"); } }else{ //PC站 $url = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $http = $_SERVER['HTTP_HOST']; if(substr($http, 0,1) == 'm'){ $newurl = str_replace('m.', 'www.', $url); header('HTTP/1.1 301 Moved Permanently'); header("location:$newurl"); } } }else{ echo "无法获取客户端标识"; }
此代码在项目入口文件处进行判断,避免不必要的数据请求,并实现了www站和m站之间的相互转换,使用301重新向方式跳转,更好的避免了seo问题。