Angular2 网站 SEO 攻略

news/2024/4/27 12:27:51/文章来源:https://blog.csdn.net/weixin_34095889/article/details/88859673

Angular 的优点有很多,但如果用它来开发网站的话,就不得不面对它的两大缺点:

  • 首页加载慢
  • 搜索引擎的爬虫获取不到页面内容

由于 Angular 是通过 js 动态生成 dom 并插入到页面中,搜索引擎默认只能获得页面的标题。我们可以使用 curl[1] 命令测试一下。

curl http://localhost:17082

可以看到类似这样的内容:

<!doctype html><html lang="en"><head><meta charset="utf-8"><title>网站的标题</title><base href="/"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/x-icon" href="favicon.ico"><link href="styles.d41d8cd98f00b204e980.bundle.css" rel="stylesheet"/></head><body style="margin:0px;"><app-root></app-root><script type="text/javascript" src="inline.59a79e692d20ba910ed0.bundle.js"></script><script type="text/javascript" src="polyfills.5d1d5b016f19755a7d41.bundle.js"></script><script type="text/javascript" src="main.a8103efb00c40fad2538.bundle.js"></script></body></html>

整个页面内容只剩下 title 了。

解决方案

目前有三种解决方案:

  1. 服务器端渲染。可以一次解决首屏加载慢和SEO问题。解决方案比较复杂,跨度较大。
  2. 页面缓存服务。目前比较流行的是 prerender.io。可以说是目前最简单且可用的 SEO 方案。本文将重点介绍此方案。
  3. 使用 phantomjs 生成静态页,再配置 nginx 在爬虫访问时提供静态页中的内容。实测稍微复杂一点的页面用 phantomjs 生成静态页时会报错。本文将只简单介绍生成首页静态页的方法。

使用 prerender 页面缓存服务

要演练此部分内容,首先你要把网站用 nginx 部署[2]。
prerender 的原理是,配置 nginx,判断出是爬虫来访时,先将请求页面地址发送给 prerender 服务,由 prerender 服务渲染出页面内容,再将页面内容返回给爬虫。prerender 官网提供的服务地址是http://service.prerender.io/ 我们可以测试一下该服务的效果,在浏览器中访问:

https://service.prerender.io/https://www.google.com

即可在浏览器中看到由 prerender 服务返回的静态页面内容了。
虽然我们可以直接使用 http://service.prerender.io/ 服务,但如果你不希望依赖一个随时可能无法访问的服务的话,可以架设一个自己的 prerender 服务。或者你希望在本地演练,还没有公网的IP或域名时,也需要架设自己的 prerender 服务。

架设自己的 prerender 服务(可选)

首先在 github 上下载 prerender 源代码。下载后执行“npm install”安装依赖项,再执行“node server.js”即可开启服务,默认端口号是 3000.我们可以使用

http://localhost:3000/https://www.baidu.com

测试一下。

注意: 如果是在 linux 下部署的话,还必须先安装 chrome 浏览器,并且不要以 root 身份执行 “node server.js”。想要一直后台运行服务的话,可以安装 forever:“npm install forever -g”,然后使用 “forever start server.js” 后台运行服务。

修改 nginx 配置文件

这一步是比较复杂和关键的。好在 prerender 已经给我们写好了 nodejs、ruby on rails、asp.net、nginx、Apache 等 10 多种 Web 服务器的配置方案,例如官方提供的 nginx 配置方式,但实测此配置文件有一点问题,直接拿过来用是不好用的。我对它进行了一些小修改:

    server {listen       17082;server_name  localhost:17082;location / {root   C:\projects\bzbclub-dist;index  index.html;location / {try_files $uri @prerender;}}location @prerender {#proxy_set_header X-Prerender-Token YOUR_TOKEN;set $prerender 0;if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {set $prerender 1;}if ($args ~ "_escaped_fragment_") {set $prerender 1;}if ($http_user_agent ~ "Prerender") {set $prerender 0;}if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {set $prerender 0;}#resolve using Google's DNS server to force DNS resolution and prevent caching of IPsresolver 8.8.8.8;if ($prerender = 1) {rewrite .* /$scheme://$host:$server_port$request_uri? break;proxy_pass http://localhost:3000;}if ($prerender = 0) {rewrite .* /index.html; # 注意这里去掉了结尾的 “break”,否则会报 404 错误}}}

修改完配置文件记得要使用命令 “nginx -s reload” 重新加载。
之后我们首先用浏览器访问我们的网站,测试一下正常访问没有异常。然后就可以使用 curl[1] 命令模拟百度蜘蛛访问页面了。

curl -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" http://localhost:17082 > z:\temp\bzb-baidu.html

之后打开 z:\temp\bzb-baidu.html 应该可以看到由 prerender 服务渲染出的页面内容。

使用 prerender 缓存服务(可选)

无论使用 prerender 官网上的服务还是自己架设 prerender 本地服务,它的速度都不快。虽然 prerender 服务返回的页面内容只给爬虫看,并不影响用户体验,但爬虫获得网页内容的响应时间也是影响搜索结果排名的!聪明的 prerender 在此看到了商机。我们来试用一下。首先,你要把 nginx.conf 中的本地服务改成官方服务 https://service.prerender.io 。然后在prerender 官网注册账户,验证邮件后登录,默认就会进入“Cached Pages”标签页,里面“your token:”后面跟着的就是分配给你的 token。将此 token 放置到 nginx.conf 中被注释掉的那行 “X-Prerender-Token” 后面并取消注释即可:

        location @prerender {proxy_set_header X-Prerender-Token rM9WgVZmgir9bSiE4sGp;set $prerender 0;if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {set $prerender 1;}if ($args ~ "_escaped_fragment_") {set $prerender 1;}if ($http_user_agent ~ "Prerender") {set $prerender 0;}if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {set $prerender 0;}#resolve using Google's DNS server to force DNS resolution and prevent caching of IPsresolver 8.8.8.8;if ($prerender = 1) {rewrite .* /$scheme://$host:$server_port$request_uri? break;proxy_pass https://service.prerender.io;}if ($prerender = 0) {rewrite .* /index.html; # 注意这里去掉了结尾的 “break”,否则会报 404 错误}}

修改配置之后使用命令“nginx -s reload”重新加载,然后再次模拟百度蜘蛛访问:

curl -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" http://47.94.88.230 > z:\temp\bzb-online.html

刷新 prerend.io 页面,在“Cached Pages”标签页下方的列表中即可看到已被自动缓存了的页面地址。实测不用缓存的时候要 3、4 秒钟的页面,缓存后只要 0.2 秒,效果很理想。不过免费账户最多只给缓存 250 个页面,一般也够用了。如果想要缓存更多页面的话就付费吧,价格表在https://prerender.io/pricing,起步价每月 15 美元可以缓存 20000 个页面。但需要注意的是,缓存默认的刷新周期都是 7 天,免费版也可以自由修改刷新周期,最短到 1 天。但付费版则是周期越短费用越高,例如起步价 15 美元那个,7 天要 15 美元,6 天要 17 美元,5 天要 20 美元,1 天则要 84 美元。

使用 phantomjs 生成静态页

prerender已经足够好了,但如果你想多了解一下 phantomjs 的话,请接着往下看。使用此种方案,需要解决 3 个问题:

  1. 如何得知网站有多少需要生成静态页的页面,生成的静态页文件以何种层级关系存放,以及如何把访问地址与静态页文件匹配。
  2. 如何使用 phantomjs 生成静态页。
  3. 如何在爬虫访问时让爬虫获取到静态页中的内容。

我们先忽略前两个问题,假设现在已经生成了首页的静态页(可以先通过浏览器保存网页的功能得到首页的静态页),先解决问题3。

如何在爬虫访问时让爬虫获取到静态页中的内容

要演练此部分内容,首先你要把网站用 nginx 部署[2]。

如何判断是爬虫访问还是浏览器访问

爬虫访问时,会使用特殊的 user agent,以百度蜘蛛的UA为例,它会使用“Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/s...)”这样的UA,所以我们可以判断 UA 中含有“Baiduspider”字样则意味着是百度蜘蛛来访问了。

如何在百度蜘蛛来访问时返回静态页

先把静态页放置到网站的 /assets/static/ 下,配置 nginx 的配置文件 nginx.conf:

        location / {root   C:\projects\bzbclub-dist;index  index.html index.htm;if ( $http_user_agent ~*  "Baiduspider"){rewrite ^/index.html$ /assets/static/index.html last;}}

保存配置文件后要使用 nginx -s reload 重新加载网站,然后使用 curl 命令的“-A”参数模拟百度蜘蛛访问首页:

curl -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" http://localhost:17082 > z:\temp\bzbclub.html

打开 z:\temp\bzbclub.html 确认是否已经返回了静态页的内容。

如何使用 phantomjs 生成静态页

生成静态页的脚本很简单:

var fs = require('fs');
var page = require('webpage').create();
phantom.outputEncoding = "utf-8";//指定编码方式
page.open("http://localhost:17082", function (status) {if (status === "success") {fs.write('z:\\temp\\index.html', page.content, 'w');} else {console.log("网页加载失败");}phantom.exit(0);//退出系统
});

将此脚本保存为“phantom-static-page.js”,在命令行执行此脚本:

phantomjs phantom-static-page.js

附录

[1] curl

在Windows下也可以使用 curl。
如果遇到 “ Failed writing body” 错误,可以使用

curl http://localhost:17082 > z:\temp\test.txt

之后即可看到生成的“z:\temp\index.html”静态页文件。

这样的命令将输出写入文本文件中,再打开文本文件查看内容即可。

[2] nginx 部署

如果你是首次使用 nginx,有几个地方需要注意。

  • 默认 nginx 不开启 gzip,需要修改配置文件开启 gzip,方法是修改 nginx.conf 配置文件的 http 节:
http {gzip    on;gzip_comp_level  6;    # 压缩比例,比例越大,压缩时间越长。默认是1gzip_types    text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml;     # 哪些文件可以被压缩gzip_disable    "MSIE [1-6]\.";     # IE6无效
}
  • 解决刷新二级页面时报 404 错误的问题

如果你不是使用hash路由(即路径中不含“#”),当你使用“在新标签页打开链接”的方式打开指向新路由的链接,或者在二级页面上刷新页面时,都会报404错误。这是因为路由指向的页面实际是不存在的,是 Angular 虚拟的,必须经由 index.html 中放置的根路由(<base href="/">)来渲染,所以需要在配置文件 nginx.conf 增加“tryfile”,把虚拟路径重定向到 index.html:

    server {listen       17082;location / {root   C:\projects\bzbclub-dist;index  index.html index.htm;try_files $uri $uri/ /index.html;if ( $http_user_agent ~*  "Baiduspider"){rewrite ^/index.html$ /assets/static/index.html last;}}}

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

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

相关文章

使用代码开发服务器统一管理系统,浅谈大型网站动态应用系统架构

动态应用&#xff0c;是相对于网站静态内容而言&#xff0c;是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。大型动态应用系统…

如何给你的网站加上favicon.ico图标

2019独角兽企业重金招聘Python工程师标准>>> favicon.ico图标是网站的缩略标志&#xff0c;可以显示在浏览器标签、地址栏左边和收藏夹&#xff0c;是展示网站个性的缩略logo标志&#xff0c;也可以说是网站头像&#xff0c;如果要让网站看起来更专业、更美、更有个…

如何建设小型直播平台_为小型网站创建更准确的搜索结果!

如何建设小型直播平台在上一篇文章中&#xff0c;我在一个小型站点上工作&#xff0c;您可以在其中搜索唐纳德特朗普最近的演讲&#xff0c;并获得有关他使用某些单词或短语的频率&#xff0c;何时使用以及最常说某些话的统计信息。 作为参考&#xff0c;他是我正在构建的网站的…

为小型网站创建更准确的搜索结果!

在上一篇文章中&#xff0c;我在一个小型站点上工作&#xff0c;您可以在其中搜索唐纳德特朗普最近的演讲&#xff0c;并获得有关他使用某些单词或短语的频率&#xff0c;何时使用以及最常说某些单词的统计信息。 作为参考&#xff0c;他是我正在构建的网站的工作原型&#xff…

用python和karrigell做网站

用python和karrigell做网站转自&#xff1a;http://www.cnblogs.com/czh-liyu/archive/2008/04/21/1164341.html从今天起,和大家一起学习用python/karrigell做网站.对于能搜到这篇文章的兄弟,一定是对karrigell是什么有大致的了解了,但是如果不知道也没关系.这个单词虽然很复杂…

如何主机屋中发布网站?

2019独角兽企业重金招聘Python工程师标准>>> 最近一直忙于学习php&#xff0c;觉得自己没有什么好写的。就在昨天&#xff0c;学习了一下发布自己的网站&#xff0c;感觉收获很多&#xff0c;再次记录下具体的过程。 第一、在网站上找到主机屋。链接网址:http://ww…

Confluence 6 创建站点的导出文件

2019独角兽企业重金招聘Python工程师标准>>> 希望为你的站点创建一个 XML 导出文件&#xff1a; 进入 > 基本配置&#xff08;General Configuration&#xff09; > 备份和恢复&#xff08;Backup & Restore&#xff09;。选择 归档到备份目录&#xff0…

用java做网站,java连接数据库并查询输出到页面

java web的后缀名是jsp&#xff0c;所以咱们要有一个jsp的开发环境&#xff0c;我这用的是jspStudy 自行百度。这软件是一个集成开发环境&#xff0c;安装启动后即可使用&#xff0c;集成了tomcat和mysql数据库首先我们先新建一个首页文件 index.jsp [java] view plaincopy <…

aws创建新的lambda_使用AWS Lambda在半小时内创建高度可扩展的网站监控服务

aws创建新的lambdaLambda函数确实是一项很棒的技术 &#xff0c;如果您还没有读懂我的理论&#xff0c;即无服务器 &#xff08;尤其是AWS Lambda&#xff09;将在2018年占领世界&#xff0c;那么请在此处查看&#xff1a; 无服务器计算将如何在2018年改变世界 无服务器计算是…

使用AWS Lambda在半小时内创建高度可扩展的网站监控服务

Lambda函数确实是一项很棒的技术 &#xff0c;如果您还没有读懂我的理论&#xff0c;即无服务器 &#xff08;尤其是AWS Lambda&#xff09;将在2018年占领世界&#xff0c;那么请在此处查看&#xff1a; 无服务器计算将如何在2018年改变世界 无服务器计算是一个相当新的概念&a…

此时无法创建您的帐户_当您在网站上创建帐户时,真正发生了什么?

此时无法创建您的帐户编码语言的简单介绍。 斯坦利戴 &#xff08; Stanley Dai&#xff09;摄影 认为编码不是一种技能&#xff0c;而是一种语言。 本系列将解释一些与编码相关的关键字&#xff0c;同时帮助您更好地了解与网站和应用程序交互时幕后发生的事情。 本系列的目的…

当您在网站上创建帐户时,真正发生了什么?

编码语言的简单介绍。 斯坦利戴 &#xff08; Stanley Dai&#xff09;摄影 认为编码不是一种技能&#xff0c;而是一种语言。 本系列将解释一些与编码相关的关键字&#xff0c;同时帮助您更好地了解与网站和应用程序交互时幕后发生的事情。 本系列的目的不是要教您如何编码&am…

ssh网站服务器管理器,ssh secure shell client远程登录管理服务器操作步骤

SSH Secure ShellClient这款系统工具很多用户喜欢,方便快捷很适用于办公。下面给大家分享一下ssh secure shell client远程登录管理服务器操作步骤&#xff0c;希望大家喜欢。ssh secure shell client远程登录管理服务器操作步骤大家可以去官网下载(http://ultra.pr.erau.edu/~…

一篇博客让你学会部署社交网站( SVN+nginx+PHP+MySQL+MFS 内含所有源码包)

根据公司要求&#xff0c;实施过程大致如下&#xff1a;1 部署SVN服务器&#xff0c;为PHP程序员创建repo目录的访问账户&#xff0c;通知程序员可以导入代码2 部署nginx服务器3 部署PHP服务器4 部署MySQL主从服务器&#xff0c;根据程序员的要求创建数据库和表5 部署MFS6 发布…

Nginx proxy代理网站常用优化配置

#proxy代理网站常用优化配置如下&#xff0c;将配置写入新文件&#xff0c;调用时使用include引用即可 #[rootNginx ~]# vim /etc/nginx/proxy_params proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_a…

WordPress SEO ☞ WordPress网站终极优化指南

原文地址&#xff1a;http://www.eastdesign.net/wordpress-seo/ 最新消息&#xff0c;东方设计学院 WordPress SEO 系列视频教程正在持续更新中&#xff0c;目前为了不至于让视频传播过于泛滥&#xff0c;设置了登陆权限&#xff0c;有兴趣查看的用户可以简单填写一个索取测…

Nginxproxy代理网站常用优化配置_马立杰_新浪博客

#proxy代理网站常用优化配置如下&#xff0c;将配置写入新文件&#xff0c;调用时使用include引用即可#[rootNginx ~]# vim /etc/nginx/proxy_paramsproxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x…

一次网站登录慢故障排查

昨天上午到公司&#xff0c;研发发邮件通知说有用户反映登录我们A站速度很慢&#xff0c;登录进去之后的操作都是正常的&#xff0c;所以基本可以排除网络与服务器压力大的因素。那么接下来就是看看数据库与缓存是否成为瓶颈&#xff0c;结果没有什么发现&#xff0c;毕竟A站是…

做一个普通网站到底有多难-100元+7天=3个站点

点击查看原文:做一个普通网站到底有多难-100元&#xff0b;7天&#xff1d;3个站点 oh 首先提醒你&#xff0c;这是一篇软文。什么&#xff0d;我不会写软文&#xff0c;也对&#xff0c;这是一篇你可以了解我做一个网站的简单省钱的过程&#xff0c;最起码这个一篇有用的软文。…

大学生网页作业之-个人主页、校园网站

作业要求 1、共用头部文件header.html&#xff0c;其它页面用iframe调用 2、首页文件模块丰富&#xff0c;要求带有姓名、学号、个人简介 3、要有注册页面&#xff0c;注册页面姓名、密码、邮箱&#xff0c;姓名要求A-Z、0-9和下划线组合&#xff0c;密码最少为6位&#xf…