如何让搜索引擎抓取AJAX内容解决方案


Posted in PHP onAugust 25, 2014

越来越多的网站,开始采用"单页面结构"(Single-page application)。

整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容。

如何让搜索引擎抓取AJAX内容解决方案

这种做法的好处是用户体验好、节省流量,缺点是AJAX内容无法被搜索引擎抓取。举例来说,你有一个网站。

http://example.com

用户通过井号结构的URL,看到不同的内容。

http://example.com#1
http://example.com#2
http://example.com#3

但是,搜索引擎只抓取example.com,不会理会井号,因此也就无法索引内容。

为了解决这个问题,Google提出了"井号+感叹号"的结构。

http://example.com#!1

当Google发现上面这样的URL,就自动抓取另一个网址:

http://example.com/?_escaped_fragment_=1

只要你把AJAX内容放在这个网址,Google就会收录。但是问题是,"井号+感叹号"非常难看且烦琐。Twitter曾经采用这种结构,它把

http://twitter.com/ruanyf

改成

http://twitter.com/#!/ruanyf

结果用户抱怨连连,只用了半年就废除了。

那么,有没有什么方法,可以在保持比较直观的URL的同时,还让搜索引擎能够抓取AJAX内容?

我一直以为没有办法做到,直到前两天看到了Discourse创始人之一的Robin Ward的解决方法,不禁拍案叫绝。

如何让搜索引擎抓取AJAX内容解决方案

Discourse是一个论坛程序,严重依赖Ajax,但是又必须让Google收录内容。它的解决方法就是放弃井号结构,采用 History API。

所谓 History API,指的是不刷新页面的情况下,改变浏览器地址栏显示的URL(准确说,是改变网页的当前状态)。这里有一个例子,你点击上方的按钮,开始播放音乐。然后,再点击下面的链接,看看发生了什么事?

如何让搜索引擎抓取AJAX内容解决方案

地址栏的URL变了,但是音乐播放没有中断!

History API 的详细介绍,超出这篇文章的范围。这里只简单说,它的作用就是在浏览器的History对象中,添加一条记录。

window.history.pushState(state object, title, url);

上面这行命令,可以让地址栏出现新的URL。History对象的pushState方法接受三个参数,新的URL就是第三个参数,前两个参数都可以是null。

window.history.pushState(null, null, newURL);

目前,各大浏览器都支持这个方法:Chrome(26.0+),Firefox(20.0+),IE(10.0+),Safari(5.1+),Opera(12.1+)。

下面就是Robin Ward的方法。

首先,用History API替代井号结构,让每个井号都变成正常路径的URL,这样搜索引擎就会抓取每一个网页。

example.com/1
example.com/2
example.com/3

然后,定义一个JavaScript函数,处理Ajax部分,根据网址抓取内容(假定使用jQuery)。

function anchorClick(link) {

var linkSplit = link.split('/').pop();


$.get('api/' + linkSplit, function(data) {



$('#content').html(data);


});

}

再定义鼠标的click事件。

$('#container').on('click', 'a', function(e) {


window.history.pushState(null, null, $(this).attr('href'));


anchorClick($(this).attr('href'));


e.preventDefault();

});

还要考虑到用户点击浏览器的"前进 / 后退"按钮。这时会触发History对象的popstate事件。

window.addEventListener('popstate', function(e) {     


anchorClick(location.pathname);  
 
});

定义完上面三段代码,就能在不刷新页面的情况下,显示正常路径URL和AJAX内容。

最后,设置服务器端。

因为不使用井号结构,每个URL都是一个不同的请求。所以,要求服务器端对所有这些请求,都返回如下结构的网页,防止出现404错误。

<html>


<body>



<section id='container'></section>



<noscript>




... ...
 


</noscript>


</body>

</html>

仔细看上面这段代码,你会发现有一个noscript标签,这就是奥妙所在。

我们把所有要让搜索引擎收录的内容,都放在noscript标签之中。这样的话,用户依然可以执行AJAX操作,不用刷新页面,但是搜索引擎会收录每个网页的主要内容!

PHP 相关文章推荐
php 在文件指定行插入数据的代码
May 08 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
PHP SOCKET编程详解
May 22 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
PHP _construct()函数讲解
Feb 03 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 #PHP
简单分析ucenter 会员同步登录通信原理
Aug 25 #PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 #PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 #PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 #PHP
php批量删除数据库下指定前缀的表以prefix_为例
Aug 24 #PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 #PHP
You might like
php输出表格的实现代码(修正版)
2010/12/29 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
PHP微信红包API接口
2015/12/05 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
jQuery使用each遍历循环的方法
2018/09/19 jQuery
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
python利用platform模块获取系统信息
2020/10/09 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
紫日观后感
2015/06/05 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
导游词之潮音寺
2019/09/26 职场文书