基于angularJs的单页面应用seo优化及可抓取方案原理分析

  categories:资料  author:

公司使用angularJs(以下都是指ng1)框架做了互联网应用,之前没接触过seo,突然一天运营那边传来任务:要给网站做搜索引擎优化,需要研发支持。搜了下发现单页面应用做seo比较费劲,国内相关实践资料分享出来的也比较少,略懵,前后花了一番功夫总算完成了。在这里记录下来,做一个总结,也希望能够帮助在做类似工作的朋友少走一点弯路。还是建议需要seo的网站技术选型尽量不要使用angular react一类的单页面框架。如果你和我一样网站做完了发现需要seo,那么往下看吧。如果各位已有更优的方案欢迎拍砖交流。

  单页面应用seo的困难在哪里?

做seo必须了解爬虫工作的基本原理。 搜索引擎能够搜到一个网页是因为对其做了索引,而在这之前需要爬虫抓取到网站页面存储为一个快照,快照的内容即页面的静态内容。一般来说,右键查看网页源代码看到的内容即爬虫所能抓取到的内容。爬虫拿到一个url后抓取其页面信息,查找页面中的a标签,拿到下一个url跳转地址,继续下一个页面抓取。seo的工作目的是增加搜索引擎对网站的索引量以及提升网页排名,传统的seo工作例如站内tdk的优化、网站url优化、外链增加都是为了达到这些目的。做到这些有一个共同的前提,就是网页内容能够被搜索引擎抓取到,而单页面应用seo的困难就卡在这里。

如果你的应用是angularjs这类单页面应用开发的,右键查看源代码你会发现网站没有动态数据。很遗憾、搜索引擎来抓取的页面也会是这样。这主要是因为两点原因:

路由、模板和ajax请求

angular实现单页面的方案是利用了路由机制配合模板引擎。通过自定义模板,一个应用只有一个主页面,通过路由切换不同的状态,嵌套对应的模板引擎。而模板中的动态数据,都是通过ajax请求从后端拿到的。这从路由跳转到渲染出完整页面的过程,除了主页面基本的静态数据,其他的全靠js来完成。

爬虫不执行js

第一条明白之后看到这里也就很明显了。很遗憾,爬虫不执行js脚本,这个也不难理解,搜索引擎每天都有海量的页面要抓取,执行js会大大降低效率;另外搜索引擎执行js脚本也存在着巨大的安全隐患。

搜索引擎拿到一个url后,获取,结束,仅仅拿到主页面中了了的几行静态信息。angular框架维护的路由、主页面,以及前端像后端发起的ajax请求等等js完成的工作,搜索引擎一概不会处理。

  url优化

可抓取方案放到下面,先说说url优化。用过angularjs的都知道,ng的url是靠#来标识一个状态。含#类似符号的url对于seo是非常不友好的,而且据同事反应(本人没有验证),搜索引擎在访问url的时候并不会带着#后的内容去访问。总之,url优化是单页面应用seo绕不开的一个工作,而我们的目的,是把url优化成如同 www.xxx.com/111/222/333 目录结构的url,它是爬虫最喜欢的形态。

如何去除ng框架url中的#,google和百度都能够搜到不少资料。如:http://blog.fens.me/angularjs-url/

简单来说,去除#只需要在路由中配置$locationProvider.html5Mode(true); 开启html5模式,url会自动去除#以及.html后缀达到最优。但这时存在问题:f5刷新会404找不到页面,原因是f5会把url提交到后端获取资源,而html5模式优化后的url在后端并不存在这样一个资源,直接访问这个链接会连主页面都找不到,自然就会404。以上链接给出的方案是nodejs后端的方案,我们的方案是用springMVC后端,不过原理都是类似的:后端不认识这个链接,我们就把这个错误的连接重定向到原本带#的连接,对于后端来说就是一个正常的访问,而url中的#在浏览器端会再次被html5模式给去除。

重定向的工作可以放在后端springMVC的过滤器中解决,也可以在容器中解决。我们的框架是后端用nginx做负载均衡,我将重定向放在nginx.conf中,对每个路由状态的url都做了对应的原始url重定向,问题解决。无论如何刷新、访问,页面都是简单舒适的目录结构url。

  两种可抓取解决方案

url优化之后,继续往下看。说白了我们要做的就是单页面应用的可抓取方案,即:如何让搜索引擎能够获取到完整内容的页面信息。我调研了现有的一些解决方案,思路都是类似的。搜索引擎不执行js,我们改变不了,那么我们只有像照顾婴儿一样,自己将js执行,拿到模板以及动态数据渲染出一个完全静态的页面,交给爬虫。我调研过git上的两个方案,做一个分享,如果大家有更好的方案也欢迎分享。

方案一、johnhuang-cn/AngularSEO

https://github.com/johnhuang-cn/AngularSEO,这是一个java后端的解决方案。主要分为两块:服务端过滤器,本地爬虫。服务端过滤器有两个作用:一是为了拿到url,二是识别搜索引擎请求并重定向到本地快照;本地爬虫是为了渲染页面为本地快照。工作流程大致如下:

web.xml中配置上过滤器,第一次访问网站的时候过滤器抓取到url,交给本地爬虫。这个爬虫是一个拥有动态数据抓取能力的爬虫,主要利用了selenium+phantomjs框架,关于这两个框架可以自行google,其中phantomjs是一个webkit内核。它能够抓取动态数据的原因就在于它可以获取dom元素执行事件以及相关js。在获取到完整的页面信息后,它会将形如:http://abc.com/#/about的url对应静态存储到本地命名为http://abc.com/_23/about 的快照。也就是说,我们需要等待本地爬虫将每个url渲染出本地快照,然后搜索引擎爬虫来访问时,过滤器将请求重定向到对应的快照页面。过滤器如何识别爬虫呢?是通过http包头中的userAgent,每个搜索引擎拥有自己的userAgent,在过滤器内配置上即可。

优点:这个方案有几个优点。1、部署相对简单,对于java应用来说,配置相对方便简单。2、搜索引擎访问效率较快,由于快照已经被保存好了,搜索引擎来抓取后直接会返回静态页面。

弊端:这个方案同样存在几个弊端。1、本地爬虫抓取速度慢,对于我们拥有海量动态数据的如资讯模块,保存快照是个耗时的工作。2、实时性,框架通过配置本地爬取频率来更新快照,意味着搜索引擎抓取页面的实时性受限于更新频率。3、稳定性,不知道现在是否还存在这些问题,可能由于当时该框架还不很成熟,我在试用中,本地爬虫的激活不够稳定,另外phantomjs进程出现过无法退出的现象,导致后台开启大量phantomjs内存耗尽。4、分布式部署问题,我们利用nginx负载均衡做了后端集群,搜索引擎来了之后按规则分配到不同后端,导致使用此框架需要在每个后端部署,引来一系列不便和问题。

由于以上弊端,此方案最终被我放弃了。

方案二、prerender.io 

该方案是我调研过程中找到的相对成熟的解决方案,较为完美的解决了我的需求。原理图如下,可参考:http://www.cnblogs.com/whitewolf/p/3464555.html

prerender.io也分为两块,客户端以及服务端prerender服务,客户端的工作是识别搜索引擎请求并做重定向(和方案一类似),除了userAgent它还会通过escaped_fragment做搜索引擎识别,这是谷歌的一套可抓取方案,详情可见:Google’s ajax crawling protocol阅读全文

互金平台灰度发布的三段式探索与实践

  categories:资料  author:

本文将从某互联网金融平台的线上版本发布工作出发,介绍了整个发布过程的优化及改造,以及对于灰度发布的探索及最终实践。

 

先要说明一点,任何脱离实际业务的技术工作都是耍流氓,技术需要服务于业务。因此,本文尽量淡化了业务方面的因素,聚焦于技术层面,建议在实际运用中还是要根据各自的业务场景去变化和调整。

 

其次,本文重点描述了线上发布的实施改造思路及演进过程,但对于其它相关联的一些点,比如发布规范流程、配置管理、监控、自动化工具的实施等不做过多涉及,如有兴趣可后续交流。

应用逻辑架构
 
 

 

图1 应用逻辑架构图

 

客户端
 

 

包含手机APP、Web页面(主站/营销站等)、H5页面等,即访问发起方,来自于真实用户。

 

WEB
 

 

主要实现转发功能,利用Nginx实现,同时包含一些业务策略和跳转设置。

 

BFE
 

 

Business Front End,业务前端,实现接入和业务聚合功能,有点类似于API网关,但和业务有一定耦合,用Tomcat war包发布。

 

APP
 

 

业务应用层,实现具体业务功能,目前几十个APP模块,用Tomcat war包发布。

 

Data
 

 

数据层,如数据库、缓存、分布式文件系统等。

 

公共组件
 

 

包含配置中心,任务调度中心,服务注册发现中心,消息队列等(这4个公共组件和灰度发布有一定关系,后续会单独介绍)。

 

注意:
  • WEB->BFE:通过Nginx反向代理转发流量,HTTP请求;
阅读全文

六款最佳Linux教育应用

  categories:资料  author:

位居榜首的是Edubuntu。顾名思义,Edubuntu是非常流行的Ubuntu发行版的一个变种,旨在让Ubuntu进入到广大教室。Edubuntu可能是最大名鼎鼎的专注于教育用户的Linux发行版。它名至实归,因为它随带大量的程序。目前的Edubuntu 14.04.2 LTS发行版非常庞大,占用空间达到2.9GB。Edubuntu提供了捆绑的教育软件,按照年级段分类,可以从软件中心来安装。捆绑的教育软件分门别类:学前、小学、中学和大学。Edubuntu建立在Ubuntu的基础上,所以安装起来就跟Ubuntu一样简单。它还有大量丰富的应用程序,因而对数学和科学有兴趣的人来说有很大的吸引力。

Edubuntu使用Unity桌面环境

2
UberStudent

   Uberstudent是另一款流行的Linux发行版,专注于教育领域,针对中学和大学进行了高度定制。Uberstudent同样建立在Ubuntu的基础上(Uberstudent 4.3基于Ubuntu 14.04.2 LTS),安装就跟安装Ubuntu一样简单直观。Uberstudent随带Xfce桌面环境,桌面环境来得无比简单。

Uberstudent本身就随带许多软件程序。Uberstudent较之Edubuntu的一个优势是软件组织。预安装的软件作了精心的分类,那样你很容易找到所要寻找的软件,相比Edubuntu凌乱的Unity桌面,更是如此。Uberstudent随带Zotero文献管理器,因而适合研究人员,这点再好不过了。尽管Edubuntu因Unity桌面而显得更精美,但使用Xfce桌面的Uberstudent在你系统上占用较少资源,哪怕在比较旧的硬件上也能顺畅运行。

Uberstudent的组织井然有序

3
openSUSE-Edu

如果Edubuntu和Uberstudent满足不了你的要求,你可以考虑一下openSUSE-Edu。openSUSE是另一款面向教育行业这个特定领域的发行版,功能很强大。它基本上可以满足学校从服务器到桌面的IT要求。连Live DVD都含有KIWI-LTSP服务器软件,很容易启用,用于演示。它还随带许多实用的应用程序,供学生、教师、IT管理员、甚至家长使用。openSUSE随带不同的桌面环境,包括GNOME、GNOME Classic、KDE Plasma和Mate。

OpenSUSE及Mate桌面

4
Skolelinux(教育版Debian)

   类似openSUSE-Edu,Skolelinux力求可以满足学校方方面面的IT要求。它本身随带70多个面向学校的应用程序。它还随带替代的桌面环境,包括LXDE和Mate等轻量级桌面环境和非常美观的KDE。

Skolelinux及KDE

5
KnoSciences

KnoSciences是一款基于Knoppix的发行版,它随带许多功能强大的Linux版免费应用程序。KnoSciences是一种可引导光盘系统,不需要安装到硬盘上,就能最大限度地使用它。它可以在Live模式下运行,性能非常出色。它随带多个Latex软件,包括非常流行的Lyx和Texmacs。

6

fedoraEDU

Fedora Education SIG(Edu SIG)力求优化Fedora,供教师和学生使用,无论是教育机构里面的师生还是外面的师生。该发行版随带许多教育应用程序,包括教学工具,比如用于屏幕播放的Wink和用于课程制作的Hot Potatoes,以及其他许多Web应用程序。它还随带许多针对特定年龄段的应用程序,比如gcompris(2岁以上)、sugar(6岁以上)和celestia(14岁以上)。FedoraEdu提供了一款实用的发行版,旨在推广开源教育软件的使用。

  

结束语

你很容易安装任何发行版来满足教育要求,但是如果想要一款直接就可以使用的发行版,本文介绍的这些发行版就能满足你的要求。Edubuntu和Uberstudent是最适合学生和教师的Linux发行版,Edubuntu的优点是它预先安装了大量的软件包,而Uberstudent的优点是教学组织使用这款软件轻松无忧。openSUSE-Edu可以满足学校从服务器到桌面的方方面面的IT要求。openSUSE-Edu还让你可以选择桌面环境,Skolelinux同样如此。KnoSciences不需要安装,就可以在Live磁盘上顺畅运行。之外还有fedoraEdu,这些是面向教育行业的其中几款发行版。所以,如果你在物色合适的一款,可以说选择多的是。… 阅读全文

什么是MEAN全堆栈javascript开发框架

  categories:资料  author:

使用JavaScript能够完整迅速做出Web应用程序,目前一套工具包括MongoDB、ExpressJS,AngularJS和Node.js越来越受到欢迎,其开发的灵活性和易用性加快开发效率,简化开发者的工作。

在今天你有很多架构可以选择建立一个Web应用,你需要的是快速开发,提高效率和注重健壮性,你需要的是更加精细更加敏捷的技术。

 

什么是MEAN?

MEAN是一个Javascript平台的现代Web开发框架总称,它是MongoDB + Express +AngularJS + NodeJS 四个框架的第一个字母组合。它与传统LAMP一样是一种全套开发工具的简称。

  • MongoDB是一个使用JSON风格存储的数据库,非常适合javascript。(JSON是JS数据格式)
  • ExpressJS是一个Web应用框架,提供有帮助的组件和模块帮助建立一个网站应用。
  • AngularJS是一个前端MVC框架。
  • Node.js是一个并发 异步 事件驱动的Javascript服务器后端开发平台。

在mongoDB中我们可以直接存储JSON格式的数据,然后在ExpressJS和的NodeJS服务器编写一个基于JSON的查询,并无缝地(无需像其他语言需要在JSON和语言数据模型之间转换)传递JSON到AngularJS前端。

同时,数据库调试和管理也变得轻松了许多,存储在数据库中的对象基本上等同于你在客户端看到的对象。更妙的是,前端工作人员也能够轻松了解后端代码和数据库查询,使用的是相同的语法和对象,你不必考虑多套语言的最佳实践,降低了入门门槛。

MEAN的架构原理如下图:

m01

相关工具:

  • NPM – NodeJS包管理器,类似Java的Maven。
  • Grunt – 一个Javascript任务运行器。

安装

两种安装方式:

  • 通过mean.io网站下载
    或通过git下载:git clone https://github.com/linnovate/mean.git
  • 使用Yeoman
    首先安装:npm
阅读全文

es6+angularjs+sass+gulp+browserify等组合的前端开发环境搭建

  categories:资料  author:

其实我一直是在基础设施和运维周边转,只是前段时间,因为公司前端都去忙项目去了,没空管基础设施的平台开发自己也懂一些html知识嘛,所以,“顶硬上”吧,顺便也接触一些新东西。

以前了解的web前端知识基本上就知道div+css,懂一些bootstrap的使用,其余一概不知了。

有一天,发现了一个朋友写的前端代码后,只在web前端边缘“裸奔”的我被惊呆了…

第一次见到html标签和属性还可以直接嵌入变量,前端还可以像后端web框架一样实现路由…

第一次看到css还可以调用函数,声明变量,条件判断…

我写这篇文章的触发点完全是因为,这些新奇的东西让常年驻扎在后端的我震惊了。 但是这些新奇的东西搭建起来确花费了我不少时间,一是我对前端了解不多,二是前端框架琳琅满目,网上的意见也很不统一。因此我想写一篇将这些组件整合起来的博客,并使用一个demo项目给大家参考,希望能让大家节省一些纠结的时间。

es6

es6, ECMAScript 6是JavaScript语言的下一代标准,在2015年6月正式发布了。距离现在1年多了,但是主流的几款浏览器还没完全支持es6的语法,所以在编写完代码后需要将其转换成浏览器所支持的es5代码。es6教程推荐阮一峰大神的 ES6标准入门 一书,书本写的很严谨,权威。不过搭建部分个人觉得写的有些略复杂了,es6环境搭建可以参考我翻译的一篇文章 (译)ES6环境搭建简单入门。

说说es6给我的感觉吧,让我觉得最大的区别是原生支持使用import..from..从其他文件导入模块和肥箭头匿名函数。另外原生支持class,但是并没有其他语言的class那么强,支持了静态函数,但是却不支持静态属性-.-|(静态属性已经在es7的提案中)。还有从语法的简洁度来说,(个人觉得)还不如coffeescript,搞不懂为什么还非得要使用这么长的function关键字…

angularjs

我没用过其他框架,所以对比的东西我也说不了多少,让我觉得比起“裸奔”html最大区别是,我可以在html标签的属性或内容嵌入js数据,并且这些数据在后台的更新时会自动更新到前台,让静态html也可以动态起来。这一功能在对于使用restful的web架构来说,极为方便。

sass

Sass 是对 CSS 的扩展,它允许你使用变量、嵌套规则、 导入等功能, 并且完全兼容 CSS 语法。可以让你的代码复用度上提高了不少。

语法可以参考阮一峰写的 SASS用法指南,内容写的不多,比较精简,看一遍就基本入门了。

gulp

gulp是一个构建工具,类似于makefile,将一系列构建步骤写成一个文件,需要构建的时候执行调构建命令就可以了。

gulp任务的核心是管道流,如同linux的命令行的管道

举个linux命令行的栗子:

# 这条命令将产生一个32位的随机字符串
cat /dev/urandom 
阅读全文

密码保护:Rancher技术特性全解及容器网络解决方案

  categories:资料  author:

这是一篇受密码保护的文章,您需要提供访问密码:

阅读全文

密码保护:深入浅出Docker Swarm

  categories:资料  author:

这是一篇受密码保护的文章,您需要提供访问密码:

阅读全文

密码保护:基于Docker持续交付平台建设的实践

  categories:资料  author:

这是一篇受密码保护的文章,您需要提供访问密码:

阅读全文

域名解析系统DNS诊断命令nslookup

  categories:资料  author:

Ping指令我们很熟悉了,它是一个检查网络状况的命令,在输入的参数是域名的情况下会通过DNS进行查询,但只能查询A记录和CNAME(别名)记录,还会返回域名是否存在,其他的信息都是没有的。如果你需要对DNS(域名解析系统)的故障进行排错就必须熟悉另一个强大的命令-nslookup,Nslookup可以用来诊断域名解析系统 (DNS) 的基础结构信息,可以指定查询的类型,可以查到DNS记录的生存时间,还可以指定使用那个DNS服务器进行解释,该命令在安装 TCP/IP 协议后方可以使用。

下面以海波博客的域名http://www.renhaibo.com为例,详细介绍nslookup命令在命令提示符(DOS)下的用法:

一、查询IP地址

nslookup可以方便地查询到域名对应的IP地址,包括A记录和CNAME记录,如果查到的是CNAME记录还会返回别名记录的设置情况。

用法格式:nslookup 域名,如图:

http://www.renhaibo.com/archives/29.html

回车后有三种不同的结果:

1.A记录的返回,如图:

http://www.renhaibo.com/archives/29.html

前面两行是您电脑所使用的DNS服务器名及其IP地址,出错也可以不理会,重点是最后的两行是renhaibo.com的IP地址是74.53.25.162,请注意,即使renhaibo.com的主机没有在线也同样能够返回结果。

2.别名记录(CNAME)的返回情况,如图:

http://www.renhaibo.com/archives/29.html

这就显示出和ping命令不同了,请看查看CNAME记录的结果。由于CNAME和A记录最后都是活的IP地址,所以一般情况下两者是等同看待的,命令的格式相同。这次nslookup返回了三行信息,前两行显示这是一个CNAME记录,对应的域名和IP地址。最后显示的就是目标域名, 并注明是Alias(别名)。

3.域名不存在的情况,如图:

http://www.renhaibo.com/archives/29.html

最后一行的英文表示目标域名不存在,也可能是:No response from server。你选择不同的域名商或不同的DNS解析系统,返回的结果也可能有差异,但大同小异。

二、查询其它类型的域名

我们的域名一般还配置了其他类型的记录,如MX邮件服务器记录,查看解析是否正常,这时候用ping命令就不行了。邮件服务器只能发信不能收信,是域名解析的问题还是其他的问题,Ping命令的检查只能让你误入歧途。nslookup这时候可以模拟你的其他遇见服务器进行域名解析的情况。我们需要在nslookup上加上适当的参数。指定查询记录类型的指令格式如下:nslookup –qt=类型 目标域名(注意qt必须小写)

以下是可以用的类型的格式(不区分大小写),仅提供常用的MX和NS的截图:

1.A 地址记录(Ipv4)

2.AAAA 地址记录(Ipv6)

3.AFSDB Andrew文件系统数据库服务器记录(不懂)

4.ATMA ATM地址记录(不是自动提款机)

5.CNAME 别名记录… 阅读全文

DynDNS老牌的免费动态DNS域名解析服务

  categories:资料  author:

 

DynDNS老牌的免费动态DNS域名解析服务-支持DDNS可用于Linux/Win/路由器

如果你的WEB服务、FTP服务、Email服务、游戏服务器等建立在一个动态IP上的服务器上,那么你可能就需要一个支持动态DNS的域名解析服务了。动态域名解析服务,即DDNS,英文Dynamic Domain Name Server,是将用户的动态 IP 地址映射到一个固定的域名解析服务上。

DDNS相对于我们平常用的如DNSPOD这类的DNS服务会多出一个本地客户端,每次启动时会自动将你的Web服务器上的IP地址传输到DNS服务器上,这样即便是你的IP不断变化,也不用每次都跑到DNS商那里修改解析了,DDNS会自动完成IP地址更新与解析。

支持动态DNS域名解析服务比较少见,国内也就是花生壳,而国外比较流行的就是DynDNS。这是一个成立于1997年的DNS解析商,老牌服务非常稳定,支持A, AAAA, CNAME, PTR, TXT, SPF, SRV, HINFO等,对于免费用户可以拥有4个域名,4个二级域名,4个MX记录,4个web redirects等。

DynDNS动态DNS服务支持Linux和Windows,提供了本地客户端可以直接安装,当然你也可以直接将DynDNS用在你的路由器上,支持DD-WRT, Open Wrt 、HUAWEI HG 533, ZyWALL-USG50, Linksys E3000 等。本文就来详细介绍DynDNS的申请与使用方法。

更多的免费DNS和免费SSL服务可以看看:

  • 1、Ns1.com免费DNS域名解析服务-支持AXFR请求和Secondary DNS备用服务器
  • 2、免费SSL排行汇总:免费SSL证书服务排行榜-国内外免费SSL申请与使用点评
  • 3、域名:新Freenom免费域名申请与DNS解析设置-可申请.tk,.ml,.ga,.cf,.gq域名

DynDNS老牌的免费动态DNS域名解析服务-支持DDNS可用于Linux/Win/路由器

PS:20170214更新,感谢RR233CY和ZE3kr热心提醒,本文的DynDNS是指dynu.com,而不是dyn.com。免费用户无权添加SPF/TXT记录, TTL可以设置为任意值, 用户不可以自己添加通配符记录, 系统自动添加的子域名不能修改。“TTL最短可以设置90秒”, 90秒只是默认,其实最短可以改为1秒。

一、DynDNS申请

阅读全文


快乐成长 每天进步一点点