阿里云

PHP自动判断客户端并进行301跳转

现在很多老版的网站都会有m站,在我们使用移动端访问时会自动跳转到m站,那么如何判断客户端设备是电脑还是手机或者是平板呢,有的使用的是js判断方式,以前我们使用的方式也是这样的,但是这样是损失资源的,因为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问题。

喜欢就点个赞吧

发表评论

需要先登录,才能发表评论哦!登录

网友评论
暂无评论