Post

Jekyll 的 SEO 优化

近来对博客主题、架构改进的热情明显高于写文章,略有本末倒置的意味。愧疚感驱使笔者写下最近为站点做的一些 SEO 优化:

  • 爬虫保护
  • 目录访问保护
  • permalink

爬虫保护

万维网上的站点,都会被搜索引擎爬虫抓取内容,以之作为搜索结果列表。搜索引擎会依据站点根目录的 robots.txt 所定义的规则,去抓取当前站点的内容。

对于运行在 GitHub Pages 的站点,GitHub 会默认生成一个文件 robots.txt,内容为:

1
Sitemap: {SITE_URL}/sitemap.xml

其中 URL 表示站点 URL(如 https://example.com),该文件定义了 sitemap.xml 文件的位置。

为了指示爬虫 Bot 不去抓取某些图片、文件等静态资源,可以在 robots.txt 中新增自定义的参数。在站点根目录新建文件 robots.txt 即可覆盖 GitHub Pages 自动生成的默认版本。然后添加爬虫指令:

指定 robots 范围,通配符 * 表示对所有 robot 适用:

1
User-agent: *

指定禁止抓取的路径,请注意目录必须以 / 结尾:

1
2
Disallow: /target_dir/            # 禁止目录
Disallow: /targer_file.extension  # 禁止文件

看了相关资料介绍,因为 robots.txt 文件是可以被直接访问的,所以在文件中直接列出具体目录,会暴露网站的目录结构,所以根据建议,在根目录建一个专门对 Bots 隐藏的目录 /norobots/,将所有需要隐藏的零碎文件、目录等挪到里面即可。

笔者的指令为:

1
2
Disallow: /assets/    # /assets/ 是常规资源目录,不怕暴露路径
Disallow: /norobots/  # 零碎敏感文件、目录等放置在此

此时浏览器直接访问站点 {SITE_URL}/norobots/ 还是可以看到文件列表的,达不到隐藏站点目录结构的目的,下文再作保护介绍。

最后要指定 Sitemap 的文件路径:

1
Sitemap: https://cotes.page/sitemap.xml

如果更换了域名,就要手动的更改 Sitemap 地址。此时可以使用 Jekyll 的全局配置变量取代硬编码:

robots.txt 文件顶部添加 Jekyll 的 Front Matter:

1
2
3
---
layout: null
---

然后 Sitemap 的值可修改为:

1
Sitemap: {{ site.url }}/sitemap.xml

这样域名就会随着 _config.yml 自动更改了。

完整的 robots.txt 内容如下:

1
2
3
4
5
6
7
8
9
10
11
---
layout: null
permalink: robots.txt
---

User-agent: *

Disallow: /assts/
Disallow: /norobots/

Sitemap: {{ site.url }}/sitemap.xml

Jekyll 目录保护

出于安全考虑,站点的某些目录结构,譬如上文提到的 /norobots/,不希望被外部访问,所以需要使用重定向来保护目录。 部署在 GitHub 上的 Jekyll 站点,Apache Web Server.htaccess 重定向规则会被无视(详见官方介绍),所以可以使用 GitHub 推荐的 Jekyll 重定向插件 Jekyll Redirect From

GitHub Pages 默认支持该插件,在项目的 Gemfile 里添加引用:

1
gem "jekyll-redirect-from"

接着运行 bundle 命令安装插件,安装完成后,在站点 404 页面的 YAML 头部添加跳转规则:

1
2
3
4
---
redirect_from:
  - /norobots/
---

具体的目录可以更具自己站点的实际情况定义,按照上述定义,访问 {SITE_URL}/norobots/ 会直接返回 404 页面,从而保护了敏感目录。

Permalink 是 "Permanent link" 的缩写,意为「永久链接」,即浏览器访问站点资源的完整路径地址。对于 SEO 而言,越短越精简的 permalink 越容易被发现及提高排名。

Jekyll 理所当然的有对 permalink 提供模版支持。如果 page 的 permalink 没有定义,则默认值为:

1
permalink: /:categories/:year/:month/:day/:title:output_ext

详细的 permalink 可选值请参考 Jekyll 的 Permalink 介绍

如本文,默认 permalink 是:https://cotes.page/tech/website/2018/10/30/the-seo-to-jekyll.html,很长的一串,对吧。SEO 建议 permalink 长度不超过 90 个字符,目录层次不超过 3 层,所以为了精简 permalink,计划去掉 categoriesyearmonthdayoutput_ext

为了全局生效,在站点根目录 _config.yml 文件添加对 permalink 的赋值:

1
permalink: /:title/

上述变量表示:文件站内链接格式为 /{{ page.title }}/,隐藏了静态文件的后缀,如 .html。在末尾加 / 是为了区分带扩展名的访问:若 permalink 定义为 /:title,访问 /:title:output_ext 是被允许的。

精简后,本文链接地址为:https://cotes.page/the-seo-to-jekyll/,有效提高了 SEO 表现。

过程中曾担心只剩 :title 会不会引起文件名重叠,后来细想一下,post 的标题都是短句,重复的机率很小,万一真有重名,可以在文件名末端添加数字区分。

值得一提的是,博客内部原有的带 .html 后缀的跳转 URL 也要相应修改,即:{SITE_URL}/path/to/post.html 修改为 {SIET_URL}/path/to/post/,需要付出一定的时间去细心校验。

结语

本文只是对建站动态的阶段性小结,SEO 的玩法远不止这些,有兴趣可以自行查找更多资料。

参考链接

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.