移动搜索SEO:网站移动适配之Meta标注、移动跳转终结篇

这些天,在给博客的标签页(tag)添加跳转和 META 动态申明时,居然让我醍醐灌顶,发现之前的动态适配的做法是多么的苦逼和小白!

总结前,先来回顾下小白张戈在移动适配这条道路上的摸爬滚打:

  1. 百度开放适配专用 sitemap 制作说明
  2. 360 站长平台移动适配文件制作说明
  3. 完美实现移动主题在 360 网站卫士缓存全开情况下的切换
  4. 移动搜索 SEO 分享:利用 Meta 声明来做百度开放适配
  5. 利用 Meta 申明来做百度、谷歌、雅虎、微软等搜索的开放适配

必须申明的是,本文的所有做法仅适合非响应式网站,并且需要一个额外的移动站,比如:

张戈博客的 PC 站是:http://zhangge.net 对应的移动站点是: http://m.zhangge.net

创建移动站点后,我们再通过一个 js 来判断访问者的 UA 信息,实现自动跳转功能 [详细部署方法]。

所以,移动站点的创建主要是为了弥补 PC 站在移动小屏设备下显示不佳的缺憾。然而,搜索引擎却会将他们视为不同的站点,从而影响 SEO。为了解决这个问题,我们就必须遵循搜索引擎的移动适配原则,对 2 个站点进行移动适配。

目前张戈掌握的几个搜索引擎的移动适配做法如下:

百度:xml 对应关系适配、Meta 标注适配(特有)[相关文章 1]  [相关文章 2]; 谷歌:Meta 标注适配 (同样适合雅虎、必应等国外搜索引擎)[相关文章]; 360:txt 对应关系适配[相关文章]。

下面主要分享下META 标注和移动跳转的部署方法:

一、完整代码示例

首页举例,实现移动适配 META 标注、移动站跳转的做法如下:

①、在 PC 站点部署代码:

head 部分:

<!--移动端访问首页跳转到移动首页-->
<script type="text/javascript">
(function(Switch){
var switch_pc = window.location.hash;
if(switch_pc != "#pc"){
    if(/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href='http://m.zhangge.net/';
    }
  }
})(window);
</script>
<!--百度移动适配META申明-->
<meta name="mobile-agent" content="format=xhtml;url=http://m.zhangge.net/" />
<!--谷歌、雅虎等移动META申明-->
<link href="http://m.zhangge.net/" rel="alternate" media="only screen and (max-width: 1000px)" />

footer 部分:

<a title="移动版" href="http://m.zhangge.net/#mobile" rel="nofollow">移动版</a>

②、在移动站点部署代码: 

head 部分:

<!--非移动端访问将跳转至PC页-->
<script type="text/javascript">
(function(Switch){
var switch_mob = window.location.hash;
if(switch_mob != "#mobile"){
    if(!/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
    Switch.location.href='http://zhangge.net/';
    }
 }
})(window);
</script> 
<!--谷歌、雅虎等移动META反向申明-->
<link href="http://zhangge.net" rel="canonical" />

footer 部分:

<a title="电脑版" href="http://zhangge.net/#pc">电脑版</a>

以上则为首页的移动适配+跳转的完整代码,但一个网站有 N 多页面,所以我们必须做成动态代码,实现每个网页的移动适配及跳转!

二、动态部署代码

要做动态部署代码,就得考虑建站程序所用语言,目前最流行的建站语言主要是 php 和 asp。php 以 wordpress 为主,其次有 emlog、typecho 等,asp 则主要是 ZBlog。

以往张戈博客的文章分享的适配全部都是 wordpress 专用的,而且代码繁杂,通用性很差!最近,张戈在给博客的标签页做移动适配的时候,突来灵感,找到了一个最简单通用的方法,可以应用到所有建站程序!

核心思想很简单:既然是每个页面都要做移动适配,那么先动态获得当前页面地址,然后进行规则替换即可!

①、Wordpress 专用

我们先将如下代码加到 header.php

<?php 
global $wp;
/*-- 获取当前页面地址 --*/
$current_url = home_url(add_query_arg(array(),$wp->request));
/*-- 将地址中的http://替换为http://m.  --*/
$target_url = str_replace("http://","http://m.","$current_url");
?>

然后继续添加如下代码,就能完成所有页面的 PC 站点的移动跳转和移动适配:

<script type="text/javascript">
(function(Switch){
var switch_pc = window.location.hash;
if(switch_pc != "#pc"){
    if(/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href='<?php echo $target_url; ?>';
    }
  }
})(window);
</script>
<meta name="mobile-agent" content="format=xhtml;url=<?php echo $target_url; ?>" />
<link href="<?php echo $target_url; ?>" rel="alternate" media="only screen and (max-width: 1000px)" />

至于移动站的适配,依葫芦画瓢,把进行替换的那句中的 http://和 http://m. 换一个位置即可!这还要多简单??

②、PHP 通用

I、PC 站点:

在 PC 站点的 head 部分添加 php 函数(WP 可直接加入 function.php 模板中),用于获取当前页面的移动地址:

<?php
/*-- 获取当前页面对应的移动页地址 --*/
function curMobURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://m.";$this_page = $_SERVER["REQUEST_URI"];
    if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
    if ($_SERVER["SERVER_PORT"] != "80") {$pageURL .= $_SERVER["SERVER_NAME"] . ":" .$_SERVER["SERVER_PORT"] . $this_page;}
    else {$pageURL .= $_SERVER["SERVER_NAME"] . $this_page;}
    echo $pageURL;
}
?>

然后继续添加如下代码,则可在 PC 站所有页面的 head 中动态输出【移动适配\跳转】所需要的代码:

<script type="text/javascript">
(function(Switch){
var switch_pc = window.location.hash;
if(switch_pc != "#pc"){
    if(/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href='<?php curMobURL(); ?>';
    }
  }
})(window);
</script>
<meta name="mobile-agent" content="format=xhtml;url=<?php curMobURL(); ?>" />
<link href="<?php curMobURL(); ?>" rel="alternate" media="only screen and (max-width: 1000px)" />

II、移动站点

相应的在移动站点中部署如下函数,用于获取移动站点所有页面对应的 PC 页地址:

<?php
/*-- 获取当前页面对应的PC页地址 --*/
function curPcURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";$this_page = $_SERVER["REQUEST_URI"];
    if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
    if ($_SERVER["SERVER_PORT"] != "80") {$pageURL .= $_SERVER["SERVER_NAME"] . ":" .$_SERVER["SERVER_PORT"] . $this_page;}
    else {$pageURL .= $_SERVER["SERVER_NAME"] . $this_page;}
    echo $pageURL;
}
?>

在移动站中继续添加输出代码:

<script type="text/javascript">
(function(Switch){
var switch_mob = window.location.hash;
if(switch_mob != "#mobile"){
    if(!/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href='<?php curPcURL(); ?>';
    }
  }
})(window);
</script> 
<link href="<?php curPcURL(); ?>" rel="canonical" />

③、ASP 版本

ASP 张戈非常不熟悉,所以就不详细说明了!有了上面的参考,相信用 ASP 建站程序的童鞋能轻而易举的完成!

下面仅提供获取地址代码,自己参考折腾吧!

I、获取 PC 站当前页对应的移动站地址:

<%
Function GetLocationURL()
Dim Url
Dim ServerPort,ServerName,ScriptName,QueryString
ServerName = Request.ServerVariables("SERVER_NAME")
ServerPort = Request.ServerVariables("SERVER_PORT")
ScriptName = Request.ServerVariables("SCRIPT_NAME")
QueryString = Request.ServerVariables("QUERY_STRING")
Url="http://m."&ServerName
If ServerPort <> "80" Then UrlUrl = Url & ":" & ServerPort
UrlUrl=Url&ScriptName
If QueryString <>"" Then UrlUrl=Url&"?"& QueryString
GetLocationURL=Url
End Function
Response.Write GetLocationURL()
%>

II、获取移动站当前页面对应的 PC 站地址:

<%
Function GetLocationURL()
Dim Url
Dim ServerPort,ServerName,ScriptName,QueryString
ServerName = Request.ServerVariables("SERVER_NAME")
ServerPort = Request.ServerVariables("SERVER_PORT")
ScriptName = Request.ServerVariables("SCRIPT_NAME")
QueryString = Request.ServerVariables("QUERY_STRING")
Url="http://"&ServerName
If ServerPort <> "80" Then UrlUrl = Url & ":" & ServerPort
UrlUrl=Url&ScriptName
If QueryString <>"" Then UrlUrl=Url&"?"& QueryString
GetLocationURL=Url
End Function
Response.Write GetLocationURL()
%>

有了以上代码,相信你能写出移动适配的输出代码的,不是么?

④、JS 通用版本(适配暂时不可用):

这个极其简单,直接获取当前页面地址,然后替换成对应的移动或 PC 地址即可:

PC 页面 head 部分:

<script type="text/javascript">
(function(Switch){
var switch_pc = window.location.hash;
var thisURL = document.location.href.replace(/^http:\/\//,"http://m.");
if(switch_pc != "#pc"){
    if(/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href = thisURL ;
    }
  }
})(window);
document.write('<meta name="mobile-agent" content="format=xhtml;url='+thisURL+'" /><link href="'+thisURL+'" rel="alternate" media="only screen and (max-width: 1000px)" />');
</script>

移动页面 head 部分:

<script type="text/javascript">
(function(Switch){
var switch_mob = window.location.hash;
var thisURL = document.location.href.replace(/^http:\/\/m\./,"http://");
if(switch_mob != "#mobile"){
    if(!/iphone|ipod|ipad|ipad|Android|nokia|blackberry|webos|webos|webmate|bada|lg|ucweb|skyfire|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|wap|mobile/i.test(navigator.userAgent.toLowerCase())){
        Switch.location.href=thisURL;
    }
  }
})(window);
document.write('<link href="'+thisURL+'" rel="canonical" />');
</script>

简单是简单,但这个方法的移动适配是不可行的(跳转可行),因为搜索引擎暂时还无法识别 js 输出内容。不过,谁也无法拍板说搜索引擎以后不会识别。因此,张戈还是把这个方法贴出来,也许多年后能用上,不是么? 

三、注意事项

①、代码针对的是非 WWW 的顶级域名,如果是带 www 的,需要修改代码才行,自己摸索吧;

②、代码中用到的 UA 判断 uaredirect.js,移动站和 PC 站是不一样的!可直接下载张戈博客移动站和 PC 站的 uaredirect.js,放到不同位置,然后相应修改代码中路径即可;

③、PHP 版本中用到的函数带,推荐加入到主题模板的 function 函数模版当中;

④、本文分享的移动适配仅涉及 Meta 标注的方法,至于另一种 sitemap 对应关系提交方法请移步查看

⑤、文章看起来非常复杂、详尽,我相信真有需要的童鞋绝对看得懂!如果看完还是不会,张戈可提供有偿服务,协助贵站完成移动适配:http://zhangge.net/pay/。当然还是推荐自己完成,比较有成就感!

四、成果展示

张戈博客做好移动适配有 2 个多月了,目前效果非常不错,主流移动搜索基本已完全替换为 m.zhangge.net:

百度移动搜索

360 移动搜索

神马搜索

好了,以上就是张戈博客关于移动适配和跳转的终结篇,希望对你有所帮助!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

Java & PhantomJs 实现html输出图片

Java & PhantomJs 实现html输出图片 借助phantomJs来实现将html网页输出为图片 I. 背景 如何在小程序里面生成一张图,分享到朋...

7208
来自专栏FreeBuf

如何在CTF中少走弯路(基础篇)

自己并不是专业的赛棍也没有打过很多比赛,这篇文章是自己在CTF中对于杂项这块知识学习的小结,希望可以对初入CTF的同学有所帮助,在CTF中少走弯路从而更快的提升...

1.3K4
来自专栏GopherCoder

『No19: Gorm 上手指南』

如果你是做后端开发的,日常工作中,除了熟悉编程语言之外,数据库怕是最常用的技术了吧。

6811
来自专栏GIS讲堂

web中的树形结构【小结】

最近在做一个项目,是一个b/s架构的,在项目中,用到了树形结构,即如图1所示的结构。

2802
来自专栏菩提树下的杨过

Silverlight:分包下载及SEO优化方案

一、按模块分包 一般大型的Silverlight应用,都会按模块分解成多个silverlight project,编译后就有多个xap包,然后在需要用到的场景按...

1935
来自专栏点滴积累

Cesium中Clock控件及时间序列瓦片动态加载

前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrelli...

4544
来自专栏Java技术分享

基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

在上篇《基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用》介绍了数据的分页处理,使用了Bootstrap ...

3938
来自专栏前端杂货铺

Blob初探

简介   Blob在js中意味着二进制大数据。实现该接口的对象有3个属性,分别是type(MIME),size(byte)和 一个切割方法:slice(在大文件...

3573
来自专栏大魏分享(微信公众号:david-share)

从PowerVM,KVM到Docker:存储池的配置与调优---第一篇终结(第3子篇)

VIOC 上的 VSCSI 性能调优 在本实验的 VIOC 中,一个磁盘对应 4 条 VSCSI 路径。查看磁盘默认的属性 ; # lsattr -El hdi...

5206
来自专栏nimomeng的自我进阶

OC优化指南

a) Reusing UITableViewCell:利用cellWithTableView:cellIdentifier:nibName: b)...

1441

扫码关注云+社区

领取腾讯云代金券