非服务端渲染页面如何做SEO

news/2024/4/28 22:15:53/文章来源:https://blog.csdn.net/weixin_34381666/article/details/89024351

前段时间对公司的社区h5网站,进行改版(整站重写)。老版本的网站是在一套古老的php框架下开发的,包含很多模板文件,大部分页面都是后端模板渲染,前端开发时要与后端沟通模板逻辑的编写,前后端耦合严重,非常不利于开发。为了实现前后端分离,减轻服务端的渲染压力,我们决定使用目前流行Vue框架,进行前端页面组件化开发,使用前端路由,后端只提供数据接口和必要的模板变量渲染。
但这样一来,网站的SEO就成为不得不考虑的重要问题之一,本文就是对我们实际开发中SEO解决方案的一个总结,介绍为什么要做SEO,客户端渲染应用的SEO解决方案,以及我们采用的方案。

为什么要做SEO

对于一般的功能性h5单页应用,因为其入口或使用场景的原因,使其对SEO并不敏感,例如微信下的滴滴打车。但对于社区类应用,通过搜索引擎搜索对应的帖子是基本的需求。因此在进行前期的技术方案调研时,我们首先考虑的是如何做网页的SEO。
对于服务端渲染的页面,由于页面的HTML结构直接由后端吐出,天然对搜索引擎支持良好,考虑更多的是如何让网站搜索排名更靠前。而对于页面由前端渲染,HTML结构是js动态生成的网站,由于搜索引擎目前并不支持js渲染内容的抓取,所以如何给搜索引擎爬虫提供收录的内容,成为要考虑的首要问题。

解决方案

客户端渲染应用的SEO

常见的单页应用中,页面的切换是通过URL中的哈希(#)来实现的,hash值得变化并不会发起浏览器请求,通过监听hashChnage事件,来实现前端的路由切换。对于这种应用中,搜索引擎很难抓取不同页面的内容,而且页面的渲染大多也是ajax异步获取数据后进行渲染,更加不利于SEO。为此,Google提供了一套针对这种类型的网站开发者的SEO解决方案。
方案规定:

  1. 网站提交sitemap给Google;

  2. Google发现URL里有#!符号,例如example.com/#!/detail/1,于是Google开始抓取example.com/?_escaped_fragment_=/detail/1;

_escaped_fragment_这个参数是Google指定的命名,如果开发者希望把网站内容提交给Google,就必须通过这个参数生成静态页面。
这种方案本质上是为搜索引擎提供单独页面,以供爬虫收录。

目前流行的前端路由库,大多是使用了HTML5 History API,通过这种方式,使得前端hash跳转同样能够很好的记录历史,兼容浏览器的前进后退按钮,提供良好的用户体验。同时也都提供history模式,例如vue-router:

const router = new VueRouter({mode: 'history',routes: routes
});

这种模式下,加上服务端的配合,能够使前端路由更加接近后端路由,提供更加友好的url,
例如: http://domain.com/user/tom 等价于 非history模式下的http://domain.com/#/user/tom

至于如何设置服务端,可以参看vue router教程history-mode;

因为网页的的地址发生了变化,浏览器会发起请求,但由于服务端设置,其实访问的还是同一个资源。这种模式下,其实SEO就可以使用我们下面介绍的方案。

首屏渲染主要内容到noscript标签

这个方案是阮一峰的一篇文章如何让搜索引擎抓取AJAX内容?里提到的,也是我们最终采用的方案。
这个方案的主要思想是:

  1. 利用History api 实现前端路由跳转

  2. 通过服务端配置,支持不带#号的URL(这个可酌情考虑,是否有必要)

  3. 通过服务端将页面主要内容渲染近<noscript>标签,供搜索爬虫抓取

这种模式下,不仅使页面更好的被搜索引擎收录,同时使网站在禁用javascript的时候,也能够浏览基本的帖子内容。

项目实际操作

我们使用了第二种方案,来做网站的SEO。
后端提供了一套机制来将页面的主要内容渲染进模板,供搜索引擎收录。首次渲染之后,如果是用户正常访问页面,后续的翻页其实是ajax请求接口,获取数据后渲染进页面。如果是爬虫或者禁用js的情况下,页面通过noscript提供收录内容和渲染页面。
先来看我们列表页的结构:

<body><div id="app"></div><noscript><!--板块列表--><div class="item"><?php if (isset($data_seo['forums'])): ?><?php foreach ($data_seo['forums'] as $key => $value): ?><div title="<?=$value['group']?>" class="item"><h1 title="<?=$value['group']?>"><?=$value['group']?></h1><div><?php foreach ($value['list'] as $_k => $_v): ?><a title="魅族社区板块<?=$_v['name']?>" href="<?=$_v['url']?>"><?=$_v['name']?></a><?php endforeach ?></div></div><?php endforeach ?>        <?php endif ?></div><!--热门推荐列表--><?php if (isset($data_seo['list'])): ?><div><?php foreach ((array)$data_seo['list'] as $key => $value): ?><a href="<?=$value['url']?>" title="<?=$value['subject']?>" target="_blank" class="item"><h1><?=$value['subject']?></h1><div class="info"><div class="author"><span title="作者"><?=$value['author']?></span><img src="<?=$value['avatar']?>" title="<?=$value['author']?>的头像" alt="<?=$value['author']?>" /></div><div class="view"><span title="回复数"><?=$value['replies']?></span><span title="浏览数"><?=$value['views']?></span></div></div><!--图片搜索--><div class="image"><img src="<?=$value['pic']?>" title="<?=$value['subject']?>" alt="<?=$value['subject']?>" /></div></a><?php endforeach ?></div>        <?php endif ?><?=isset($data_pager) ? $data_pager : ''?></noscript><!-- built files will be auto injected --></body>

在禁用js(爬虫访问时),得到的dom结构如下图
图片描述

这样浏览器即使禁用了js,依然能够显示出网站的关键内容,而页面上的网址也是爬虫继续收录的入口。

优化

其实,上面的方案在首屏渲染的时候,已经包含了页面所需的数据,而这些数据是可以被js渲染页面时所利用的,将首屏数据渲染进js变量,就可以减少首屏渲染的http请求。

例如,我们将首屏的列表数据,渲染进全局变量,对应的地址: https://domain/forum-22-1.htm...

<script type="text/javascript">var data_index_list = <?=isset($data_index_list) ? $data_index_list : 0?>;var data_current_page = <?=isset($data_current_page) ? $data_current_page : 0?>;
</script>

然后在vuex获取列表数据时,我们就可以判断,如果当前页面前端路由的页面和后端的当前页面是同一个,就直接在data_thread_list 取数据:

[actions.FETCH_FORUM_LIST]({commit, state}, params) {commit(actions.FETCH_FORUM_LIST_PENDING);if (window.data_current_page === params.page) { // 如果当前前端路由的页面和后端的当前页面是同一个,就直接在data_thread_list 取数据let forumlistData = window.data_thread_list.data;commit(actions.FETCH_FORUM_LIST_SUCCESS, forumlistData);return;}axios.get() // ajax请求获取页面数据。
}

这样一来,当页面首次渲染时,我们就不需要发起任何ajax请求:
图片描述

参考文档

如何让搜索引擎抓取AJAX内容
url的 #号
单页应用SEO浅谈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_762276.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球钓鱼网站调查报告:近半恶意注册域名针对国内银行企业

本文讲的是全球钓鱼网站调查报告&#xff1a;近半恶意注册域名针对国内银行企业&#xff0c;据最新报告显示&#xff0c;黑客越来越多地开始滥用那些高度分散的网络域名注册系统来购买可用于网络钓鱼攻击的互联网地址了。 他们所设计的骗局往往会使用合法获取的地址来设置模仿银…

知名网站的 404 页面长啥样?你的404长啥样?

每天浏览各大网站&#xff0c;难免会碰到404页面啊。你注意过404页面么&#xff1f;猿妹搜罗来了下面这些知名网站的404页面&#xff0c;以供大家欣赏&#xff0c;看看哪个网站更有创意&#xff1a; 新浪 新浪微博 优酷 腾讯 网易 淘宝 京东 搜狐 知乎 美团 饿了么 segmentfaul…

200个化工网站批量爬取

Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spma1z38n.10677092.0.0.482434a6EmUbbW&id564564604865 顺利100网站64秒 200网站570秒就搞不懂了&#xff0c;差距太大了。。 # -*- coding: utf-8 -*- """ Cre…

学SEO你其实只需要半个钟

网站上线之前&#xff1a; 关键词的分析以及选择&#xff1a; 关键词在我们网站的每个页面&#xff1a;首页&#xff0c;栏目页&#xff0c;文章都存在&#xff0c;它定位了你的网站的这个页面是做什么的&#xff0c;有什么内容&#xff0c;也是SEO中的最重要的部分。 网站必须…

黑客是怎样入侵你的网站的

这个问题很难回答&#xff0c;简单的来说&#xff0c;入侵一个网站可以有很多种方法。本文的目的是展示黑客们常用的扫描和入侵网站的技术。假设你的站点是&#xff1a;hack-test.com让我们来ping一下这个服务器&#xff1a;我们得到了一个IP地址&#xff1a;173.236.138.113 –…

vs中正常IIS发布网站后css样式、图片丢失jQuery报错 $ is not defined

问题描述&#xff1a; VS运行能够正常看到样式和图片 &#xff0c;IIS发布后样式丢失、图片不显示。并且jQuery报错“$ is not defined”。 问题分析&#xff1a; 1、首先怀疑是样式文件、图片等发布的时候没有发布出来&#xff0c;缺少文件&#xff0c;检查发布后的文件后&…

电商网站架构案例(3)

本文章是电商网站架构案例的第三篇&#xff0c;主要介绍数据库集群&#xff0c;读写分离&#xff0c;分库分表&#xff0c;服务化&#xff0c;消息队列的使用&#xff0c;以及本电商案例的架构总结。 6.5数据库集群&#xff08;读写分离&#xff0c;分库分表&#xff09; 大型网…

如何解决ASP.NET网站'__doPostBack' is undefined的脚本错误

最近碰到一个很奇怪的问题&#xff01; 新发布一个ASP.NET的网站&#xff0c;基于.net 4.0 framework&#xff0c;基本没有用到什么特别新的技术&#xff0c;但是由于给客户预览用的服务器比较老&#xff0c;操作系统用的是Windows 2003&#xff0c;上面默认只支持IIS 6。将网站…

【网站安全】网站被挂木马与777权限的奥妙

某天站长平台的微信群里的一位同学说网站被人挂马了&#xff0c;查了半天也查不到原因。艺龙SEO负责人刘明问了一句“是不是技术把linux系统里网站的核心目录设置777文件权限了”&#xff0c;同学查后发现果然如此。那么&#xff0c;777是什么&#xff1f;老虎机吗&#xff1f;…

分布式网站隔离术

隔离是将系统或资源分隔开&#xff0c;系统隔离是为了在系统发生故障时&#xff0c;能限定传播范围和影响范围&#xff0c;即发生故障后不会出现滚雪球效应&#xff0c;从而保证只有出问题的服务不可用&#xff0c;其他的服务还是可用的。在此介绍的隔离手段有&#xff0c;线程…

不用 PS 和 AI,5个网站能做出更好看的设计

要完成漂亮的设计&#xff0c;一定要掌握 PS、AI、Sketch 等专业的做图工具才可以。其实&#xff0c;现在有很多网站可以帮助不会专业设计工具的我们&#xff0c;做出很多很漂亮的设计&#xff0c;完成自己的设计需求。今天&#xff0c;我们就来介绍一下这些网站。 原型设计 ST…

Android上PhoneGap打包本地网站和在线网站

谢谢刚子提供这么个社区交流平台&#xff0c;特别感谢刚子提供上传权限&#xff0c; 哈哈&#xff0c;今天也发一个简单的Demo上来上来&#xff0c;给社区贡献一点绵薄之力。最近一直关注移动web开发&#xff0c;更多看的是web开发的程序的效果&#xff0c;还没有深入的去编程或…

JavaScript 编程精解 中文第三版 二十一、项目:技能分享网站

二十一、项目&#xff1a;技能分享网站 原文&#xff1a;Project: Skill-Sharing Website 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解&#xff08;第 2 版&#xff09;》 If you have knowledge, let others l…

用户登录界面(1.8版本--网站框架改进)

1.创建数据库db_user与表users 1 CREATE DATABASE db_user CHARACTER SET utf8;2 3 CREATE TABLE users (4 userid TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,5 username varchar(20),6 passwd varchar(20),7 email varchar(30),8 priority int9 ); 10…

linux --xampp 配置多个网站

我们想要在本地安装两个测试域名&#xff0c;www.abc.tld, www.xyz.tld, 分别指向到 htdoc 目录下的 abc.tld 和 xyz.tld 文件夹下。tld 是顶级域名 the top domain 的缩写。如果你喜欢&#xff0c;也可以用 abc.com, abc.net 这样的顶级域名来代替。这里使用 tld 主要是为了避…

Dropbox泄密事件仍在蔓延 一家成人网站被爆掉80万帐号密码

上周黑客在暗网相继泄漏了 Dropbox 和 Last.fm 两家公司的上亿条账号密码&#xff0c;暴露了互联网公司在保护用户信息上的严重缺陷。但现在这场“泄密事件”仍没有停止的迹象&#xff0c;最新的消息是黑客团队泄漏了色情网站 Brazzers 近 80 万条用户账号密码。 这个被黑客公布…

Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

项目前言 在上一篇博客《JenkinsGitGitlabAnsible实现持续化集成一键部署静态网站&#xff08;一&#xff09;--技术流ken》中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个静态的网站。 如果大家可以熟练掌握以上内容&#xff0c;势必会在工作中减轻不小的工作量…

Asp.net网站的简单发布

概述 网站是由一个个页面组成的&#xff0c;是万维网具体的变现形式&#xff0c;关于万维网&#xff0c;网页的方面的理论知识&#xff0c;大家可以看一看这篇博客&#xff1a;万维网文档&#xff0c;在这里就不多说了。网站的发布要到达的一个目的就是&#xff0c;别人可以通过…

SharePoint 2010 类似人人网站内信功能实施

简介&#xff1a;用SharePoint代码加实施的方式&#xff0c;完成类似人人网站内信功能&#xff0c;当然&#xff0c;实现的比较简单&#xff0c;样式也比较难看&#xff0c;只为给大家一个实施的简单思路&#xff0c;如有谬误&#xff0c;还请见谅。当然&#xff0c;还有就是截…

2019最受欢迎开源免费CMS建站系统排行榜

2019独角兽企业重金招聘Python工程师标准>>> 互联网的蓬勃发展&#xff0c;免费且开源的建站系统的层出不穷&#xff0c;而我们经常在网上看见有人问及”哪个CMS系统最好用”、”企业建站用哪个CMS系统最多”等类似问题&#xff0c;我们今天来说一下&#xff0c;201…