基于 Hugo 的搜索引擎 SEO,站点地图自动推送
By S.F.
本文链接 https://www.kyfws.com/post/kyfws-hugo-baidu-seo/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 5 分钟阅读 - 2029 个词 阅读量 0基于 Hugo 的搜索引擎 SEO,站点地图自动推送
Hugo 作为静态个人博客或者网站来说,是非常方便而且功能强大的,下面介绍一下本站的 SEO 过程。
点击这里阅读本站的安装过程
Meta 标签优化
总所周知,搜索引擎会根据网站 robots 文件确定访问权限,采集链接的深度,并对页面的Title
,Description
,Keywords
三个关键信息进行收集。对此,这三个位置的内容是非常重要的。
Title
<title>{{ block "title" . }}{{ with .Params.Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
一般不超过80字符
Description
<meta name='description' itemprop="description" content="{{ if .Description }}{{ .Description }}{{ else }}{{if .IsPage}}{{substr .Summary 0 100}}{{ end }}{{ end }}">
一般不超过200字符
Keywords
{{ if .Keywords }}
<meta name="keywords" content="{{ delimit .Keywords ", " }}" >
{{else}}
<meta name="keywords" content="{{ delimit .Site.Params.Keywords ", " }}" >
{{ end }}
一般不超过100字符
Robots
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
<META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
{{ else }}
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
{{ end }}
可以省略,只需要到站点根目录下准备 robots.txt 即可
Robots 模板
User-agent: *
# robotstxt.org - if ENV production variable is false robots will be disallowed.
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
Disallow:
{{ else }}
Disallow: /
{{ end }}
User-agent: *
Allow: /
Sitemap.xml
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>" | safeHTML }}
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
>
{{ range .Data.Pages }}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}
</url>
{{ end }}
</urlset>
模板的使用
HUGO_ENV="production" hugo
环境变量指定为生产环境
搜索引擎登录
登录百度
注册并完成网站的添加
HTTPS 配置
本站使用的 caddyserver 作为前端 web 服务
domain.com {
redir https://www.domain.com{uri} 301
}
www.domain.com {
reverse_proxy 127.0.0.1:8080 #后端
tls youname@email.com
header {
Strict-Transport-Security "max-age=63072000"
}
}
再确认 https 请求正常后,申请百度 “HTTPS认证”,通过认证后如下图:
提交 sitemap
资源提交->普通收录->资源提交[sitemap]
确认sitemap.xml 可以访问
curl https://www.yourdomain.com/sitemap.xml
输入生成好的 https://www.yourdomain.com/sitemap.xml
主动推送
自动推送是百度搜索资源平台为提高站点新增网页发现速度推出的工具,安装自动推送JS代码的网页,在页面被访问时,页面URL将立即被推送给百度。查看详情»
服务对象及原理
自动推送代码以网页为最小对象,服务于全平台多终端,PC站和移动站均可使用。 安装代码的页面在任意平台(浏览器、微信、微博)被加载时,页面链接会被第一时间推送给百度,从而提高站点新内容的发现速度。
通过 gulp 实现
安装 node.js 源
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
安装 node.js 14
sudo apt-get install -y nodejs
安装编译环境(可选)
sudo apt-get install gcc g++ make
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
创建项目
mkdir /mnt/gulptool
cd /mnt/gulptool
配置 NPM 国内源
npm install -g cnpm --registry=https://registry.npm.taobao.org
安装依赖的模块
npm init
cnpm install gulp-cli -g
cnpm install gulp -D
gulp --help
cnpm install xml2js --save
cnpm install xmlhttprequest --save
API 提交
使用说明
- 普通收录工具可以向百度搜索主动推送资源,缩短爬虫发现网站链接的时间,不保证收录效果。
- API提交和手动提交共享配额,每日至多提交10万条有价值的内容,sitemap提交配额不与其他方式共享,具体配额以站点页面显示数据为准,提交内容会进入百度搜索统一管理。
- 仅限提交关联过主体的站点下的内容,否则无法成功提交,配额不可累计,当日有效。
- 若链接存在跳转关系,请直接提交跳转后链接。如网站换域名,需提交新域名资源;进行HTTPS改造页面,请提交HTTPS资源。
推送接口
接口调用地址:http://data.zz.baidu.com/urls?site=https://www.yourdomain.com&token=tokens
参数名称 | 是否必选 | 参数类型 | 说明 |
---|---|---|---|
site | 是 | string | 在搜索资源平台验证的站点,比如www.example.com |
token | 是 | string | 在搜索资源平台申请的推送用的准入密钥 |
推送示例
-
curl推送示例
-
将要提交的链接按照每行一条的格式写入一个文本文件中,命名此文件为urls.txt,然后进入该文件所在目录,执行如下命令:
curl -H ‘Content-Type:text/plain’ –data-binary @urls.txt “http://data.zz.baidu.com/urls?site=https://www.yourdomain.com&token=tokenxxxxx"
使用php、python、java等可以参照这个过程推送结构化数据。
查看推送反馈
推送成功
状态码为200
,可能返回以下字段:
字段 | 是否必选 | 参数类型 | 说明 |
---|---|---|---|
success | 是 | int | 成功推送的url条数 |
remain | 是 | int | 当天剩余的可推送url条数 |
not_same_site | 否 | array | 由于不是本站url而未处理的url列表 |
not_valid | 否 | array | 不合法的url列表 |
成功返回示例:
{
"remain":99998,
"success":2,
"not_same_site":[],
"not_valid":[]
}
推送失败
状态码为4xx
,返回字段有:
字段 | 是否必传 | 类型 | 说明 |
---|---|---|---|
error | 是 | int | 错误码,与状态码相同 |
message | 是 | string | 错误描述 |
失败返回示例:
{
"error":401,
"message":"token is not valid"
}
程序设计
- 读取生成的 sitemap.xml
- 转换为符合要求的提交格式
- 逐条提交,定期运行
代码
cd /mnt/gulptool
vim gulpfile.js
创建 default 任务,并监控 Hugo
输出的 public/sitemap.xml
文件的变化
const gulp = require('gulp');
const fs = require('fs');
const xml2js = require('xml2js')
const parser = new xml2js.Parser();
var baidu_token= 'token'; //百度提供的
var domainname = 'https://www.yourdomain.com'; //你的域名
//每天需要提交的url数量,注意这个数字必须要跟百度允许提交的url数量一致,如果多了会提交失败.
const ccc = 20
function postBaidu(){
// 读取sitemap.xml文件并且转换成json
fs.readFile('/mnt/blog/public/sitemap.xml', function(err, data) {
parser.parseString(data, function (err, result) {
// 把读取的数据传入这个函数
urlSubmit(result.urlset.url)
console.log('Done');
});
});
function urlSubmit(urls) {
// 百度站长
var baidu_target = "http://data.zz.baidu.com/urls?site="+domainname+"&token="+baidu_token;
allUrls = urls.map(item=>item.loc[0]).join('\n')
var postcontent = urls.slice(0,ccc)
postcontent= postcontent.join('\n');
console.info('开始提交百度站长\n',postcontent)
Post(baidu_target,postcontent,'提交成功')
// 提交数据
function Post(target,urls,message){
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
xhr.open('POST', target, false);
xhr.setRequestHeader('Content-type', 'text/plain');
xhr.onload = function () {
console.log(this.responseText);
if(message){console.info(message)}
};
xhr.send(urls);
}
};
}
gulp.task('default',function(){
gulp.watch('/mnt/blog/public/sitemap.xml',function(){ //监控文件
postBaidu();
});
});
执行任务
nohup /usr/bin/gulp -f /mnt/gulptool/gulpfile.js > /mnt/blog/public/task.txt 2>&1 &
当每次生成并更新 sitemap.xml
文件,将自动提交百度
root@server:/mnt/gulptool# gulp
[16:19:10] Using gulpfile /mnt/gulptool/gulpfile.js
[16:19:10] Starting 'default'...
[16:19:42] Starting '<anonymous>'...
百度站长开始提交 https://www.kyfws.com/tags/c#/
https://www.kyfws.com/tags/
https://www.kyfws.com/post/conversion-algorithm/
https://www.kyfws.com/tags/%E5%8E%9F%E5%88%9B/
https://www.kyfws.com/tags/golang/
https://www.kyfws.com/post/golangpm/
......
https://www.kyfws.com/
{"remain":99884,"success":35}
百度站长提交成功
Done
写入启动
sudo vim /etc/profile
nohup /usr/bin/gulp -f /mnt/gulptool/gulpfile.js > /mnt/task.txt 2>&1 &
提交情况查询
cat /mnt/task.txt