收到 Google Search Console 提醒后,我挖出了博客的两个隐患

今天收到一封 Google Search Console 的邮件:「网页已编入索引的原因」一节提示,站点地图中的部分网页因 noindex 被排除。排查下来发现这不是问题的全部——顺着这条线索,我还挖出了一个更隐蔽的隐患:一篇文章的发布日期和 URL 正在悄悄漂移。这篇文章记录两个问题的定位过程和修复方案。

隐患一:sitemap 里的页面自带 noindex

现象

Search Console 报告:sitemap.xml 中提交的 7 个标签页(如 /tags/Hexo/)都被 <meta name="robots" content="noindex"> 排除,”提交收录”和”页面拒绝收录”自相矛盾。

定位

检查主题源码,Icarus 在 head.jsx 里有一行明确的策略:

1
const noIndex = helper.is_archive() || helper.is_category() || helper.is_tag();

也就是说,Icarus 刻意不让归档、分类、标签页被收录——这些页面内容与文章列表高度重复,noindex 是避免重复内容稀释权重的常见做法,本身没问题。

问题出在 hexo-generator-sitemap 的默认配置上:它默认把标签页也写进 sitemap,于是产生了矛盾。

修复

在 _config.yml 的 sitemap 配置中加两行:

1
2
3
4
sitemap:
path: sitemap.xml
tags: false
categories: false

重新生成后,sitemap 从 14 个 URL 变成 7 个,只剩文章页、首页和 about 页,与主题的 noindex 策略保持一致。这类提醒本身不影响正常文章的收录,属于配置不一致问题,但顺手处理掉可以让 Search Console 的报告更干净。

隐患二:会”漂移”的文章日期(真正的问题)

在核对页面时发现,最早的 Hello World 文章,发布时间显示成了 10 月 2 日。深入排查后发现,这不只是显示问题。

定位

对比几篇文章的源文件,发现了关键差异:

1
2
3
4
5
# 其他文章都有
date: 2024-12-01 22:07:51

# hello-world.md 只有
title: Hello World

hello-world.md 是 Hexo 初始化时的示例文章,front matter 里缺少 date 字段。Hexo 的回退逻辑是:没有声明日期时,用文件的修改时间(mtime)作为文章日期。

在本地构建时,文件时间戳被保留,日期显示正常。但博客是通过 GitHub Actions 构建部署的,而 actions/checkout 不保留文件时间戳——构建机上所有文件的 mtime 都等于拉取代码那一刻。于是:

1
文章日期 = 最近一次构建日期

上一次构建是 10 月 2 日,所以页面显示 10 月 2 日。

更严重的后果

Hexo 的文章永久链接由日期决定(/:year/:month/:day/:title/),所以这不只是日期显示错误——验证后发现:

  • 旧地址 https://www.makiblog.cn/2024/10/08/hello-world/ → 404
  • 文章实际地址已经漂移到了 /2026/10/07/hello-world/

也就是说,这篇文章的 URL 每次构建都会变,外部链接失效,还会不断给搜索引擎制造 404。

修复

在 front matter 补上原始日期:

1
2
3
4
---
title: Hello World
date: 2024-10-08 23:29:42
---

部署后验证:旧地址恢复 200,漂移地址消失,日期永久固定。

复盘与启示

这两个问题有同一个模式:本地一切正常,CI 构建环境却不同。

  1. sitemap 问题是配置层面的不一致:插件默认收录标签页,主题却 noindex 它们。两套默认行为各自合理,叠加起来就矛盾了。
  2. 日期漂移是环境差异:本地保留了文件 mtime,CI 的 checkout 重新生成。依赖文件时间戳而不是显式声明的数据,在任何构建流水线里都是隐患。

以后写文章记两条:front matter 必须带 date 字段(hexo new 默认会生成,手写时别省略);sitemap 提交的页面集合要和页面的 robots 策略对齐。

一次 Hexo 布局崩溃的排查记录:同名样式文件覆盖了主题

把博客从 WordPress 换到 Hexo + icarus 主题之后,我开始给博客加自定义样式。结果改完一部署,页面布局整个崩了:导航栏样式没了、卡片排版乱掉,几乎是”裸奔”状态。这篇文章记录一下这次事故的排查过程,以及 icarus 主题下自定义 CSS 的正确姿势。

阅读更多

从 WordPress 到 GitHub Pages:一次博客平台的"换轨"记录

从 WordPress 到 GitHub Pages:一次博客平台的”换轨”记录

折腾了两天,我的博客终于完成了从「云服务器 + WordPress」到「GitHub Pages + Hexo」的平台切换。这篇文章记录一下切换的过程、分支迁移的思路,以及一些踩坑经验,希望能帮到同样想”换轨”的朋友。

阅读更多

断舍离

断舍离 - 山下英子

放手一个无用之物,就腾出一点空间。处理一件多余之物,就减少一份负担。减少一次浪费,就恢复一分精气神。然后,翻开人生新篇章。

阅读更多

自我介绍

大家好,这里是maki,欢迎来到我的博客。

阅读更多
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.