项目进展2026-10-23

志睿源官网|搜索引擎收录改造 上线记录

文章页服务端预渲染、假 404 修复、站点地图 101 条上线,内部底稿加不收录标记

零、结论

清单里第 1 项(首页装饰数字)与第 3 项(文章页服务端预渲染)已上线并逐项实测通过。 清单里的第 5 项(站点地图)、以及评估时发现的假 404、内部底稿可能被收录、爬虫被自家限流挡住三个问题,一并做完了。

一句话定性:这一轮改的是「机器能不能读懂」,不是「排名能不能上去」。 收录与排名是慢变量,见效以周计,改完当天看不到变化是正常的。

关键数字(改前 → 改后)

项目改前改后
文章页返回字节6 63814 398
文章页可见文字187 字1 707 字
页面标题全站统一「文章 · 志睿源」文章真名
规范地址 / 结构化数据 / 一级标题0 / 0 / 01 / 1 / 1
不存在的文章200 + 假提示页404 + 不收录标记
站点地图404200,101 条地址
首页源码里的重复数字「2626 年」「55 个」「¥¥300」无重复

一、逐项改了什么

1. 文章页改为服务端预渲染(清单第 3 项)

原来的文章页是一个 6 638 字节的空壳:标题写死「文章 · 志睿源」,正文全靠浏览器里的脚本填。人不带脚本看只有 187 个字,机器看到的是一张白纸。

现在服务端在发出页面之前就把内容拼好,地址形状完全不变(仍是 /zry/article.html?slug=xxx)。之所以不动地址,是因为改地址等于把已有的收录全部作废,代价是几个月的重新等待,收益不成比例。

注入的内容:

  • 页面标题 = 文章标题 + 「· 志睿源」
  • 页面描述 = 文章摘要(无摘要时取正文前 150 字纯文本)
  • 规范地址(声明这个地址的正式版本,避免同一内容被当成多份)
  • 分享卡片标签:类型、站名、标题、描述、地址、图片;有封面用大图样式,无封面降级为小图样式
  • 结构化数据:文章体裁 + 标题 + 摘要 + 发布时间 + 修改时间 + 所属分区 + 作者与发布方
  • 一级标题只出现一次(正文里原有的重复标题已剥掉)
  • 正文、上下篇导航、归属回链(栏目 / 产品 / 服务)

降级策略:数据库连不上或渲染内核没初始化时,回落到原来的静态壳,绝不吐 5xx。宁可少给机器一点信息,不能让真人看到报错。

2. 不存在的文章改为真 404(清单外发现)

改前随便敲一个不存在的地址,服务器回 200,页面用脚本写一句「文章不存在」。这等于主动告诉搜索引擎「这个空页面是好的,收进去吧」。批量生成垃圾地址就能把一堆废页塞进索引。

现在回 404,并附不收录标记。

3. 内部底稿不再可能被收录

库里有 11 篇标记为内部的底稿,状态是「已发布」,直链能打开。这类内容一旦进了索引就是事故。

处置:页面照常返回 200(直链仍可访问),但带不收录标记;站点地图按同一规则剔除,两条口径一致。

4. 首页装饰数字(清单第 1 项)

三个大字徽标原来是「图标里一个 26」+「右侧一句话里又一个 26 年」,源码连读成「2626 年全栈工程经验」「55 个自主在研产品」「¥¥300 起」。搜索引擎摘要和复制粘贴读的是源码文字,所以摘要会变成这个样子。

清单原来的建议是加读屏隐藏属性 —— 这个建议是错的:那个属性只对读屏软件生效,挡不住摘要抓取,也挡不住复制。必须让页面结构里根本没有这个数字。

现在数字改由样式按元素属性生成,页面结构里只有右侧一份。实测渲染效果不变:三个徽标仍是 32×32、17 像素、品牌色。

5. 站点地图 + 声明(清单第 5 项)

原来 /sitemap.xml 是 404。现在动态生成,文章一发布地图就跟着变,不需要手工维护。

101 条地址 = 8 个静态页 + 70 篇文章 + 12 个栏目 + 11 个产品。

顺手拦掉两类不该进的:

  • 11 篇内部底稿 —— 同上。
  • 41 篇行业情报日报 —— 这类是每日抓取的时效内容,量大、生命周期短,放进地图会稀释真正想被搜到的文章。留了一个开关,改一个常量就能放开。

这里有个坑:列表脚本把 4 篇情报的类别错标成了「项目进展」(intel-r43 到 r46),只按类别过滤会漏掉。所以除了类别,还按地址前缀兜底拦一次。

另外在 robots.txt 里加了地图声明行 —— 没有这一行,地图做了也没人来找。

6. 爬虫放行(配套,清单里没有但必须有)

站点有防爬四层,其中一层是页面限流:每分钟 120 次、突发 40。搜索引擎来抓 101 条地址会被当成攻击,先吃 429,累积几次就进封禁名单(封 24 小时,且逐次翻倍)。等于自己把门锁上。

处置:对已知搜索引擎的来源地址段豁免计数。

为什么按地址段不按客户端自称:自称谁都能伪造,一个脚本写「我是某某蜘蛛」就能白拿豁免。按地址段判断,伪造不了。

代价:并发连接数仍受另一条规则约束,不会因为放行把服务器压垮。


二、改动文件与回滚

改了哪些

位置文件说明
服务端node/zry/seo.js新增,预渲染与站点地图的实现
服务端node/zry/http.js新增 4 条路由(文章页与地图各两条,一条取页面、一条供探测)
服务端node/zry/index.js挂出接口
前端zry/index.html首页三处徽标
前端zry/css/pages.css徽标数字由样式生成
站点根robots.txt地图声明行
系统nginx 站点配置页面改为转发到应用、新增地图地址、新增爬虫地址段豁免

回滚

备份在服务器 /data/_bak/seo_20261023_021937/,内含 pre_deploy.tgz(16 个文件原件)与站点配置原件 default.conf。

三步:解包覆盖 → 重启应用 → 重载配置。配置里的限流区名(zry_page2)回滚时不要改回旧名,原因见下一节。


三、验收实测

用例期望实测
正常文章200 + 完整内容200 / 14 398 字节 / 标题正确 / 规范地址 1 / 结构化数据 1 / 一级标题 1 / 不收录标记 0 / 可见文字 1 707
不存在的地址404 + 不收录404 / 带不收录标记
不带参数的旧地址跳转到「在做什么」301 跳转正常
内部底稿直链200 + 不收录200 / 不收录标记 1 处
项目进展类文章无上下篇无上下篇(符合口径)
标题含引号的文章转义正确不截断引号已转义,分享标题完整
站点地图200 + 无内部稿无情报200 / 15 933 字节 / 101 条 / 内部稿 0 / 情报 0
地图与库对账无缺漏库内公开发布的地址 100% 在地图内
首页源码无「2626」「55 个」「¥¥300」三项均不存在;摘要读作「26年全栈工程经验5个自主在研产品¥300起按任务整体交付」
首页渲染徽标视觉不变三个徽标 32×32、17 像素、品牌色,截图核对通过
既有接口回归全部正常12 个公开接口全 200
其他服务全部在线三个应用进程全在线;错误日志零新增行

四、过程中踩到的两个坑(记下来,避免重犯)

1. 限流区不能改名重载

改爬虫豁免要动限流区的键。改完执行重载,命令返回成功,但日志里是一行 [emerg],整次重载失败 —— 磁盘上的配置已经变了,跑着的配置还是旧的。表现就是「改了没反应」,很难往配置方向想。

原因:限流区是共享内存块,不允许在重载时更换它的键。测试命令是能通过的(它只校验语法),只有真重载才报错。

处置:换一个区名(zry_page2),绕开共享内存块的复用限制,避免为此重启整个服务(会瞬断)。

2. 只登记取页面的路由,探测请求会 404

框架对请求方法严格匹配。只登记「取页面」时,部分校验工具先发的「只问头不要体」的探测请求会拿到 404,被误判成整条地址失效。

处置:补登探测路由,复用同一个处理函数。实测探测也回 200 并带完整字节数。


五、还需要你定的三件事

① 微信真机分享卡片:5 分钟自查(只读,不改任何东西)

把一篇文章发到「文件传输助手」,看卡片长什么样:有没有图、标题对不对、描述是不是正文开头。

这一步是闸门:微信的分享卡片不读网页里的分享标签,它只认公众号的接口授权,需要额外配安全域名、加一个签名服务、引一段官方脚本(约 3–4 小时)。值不值得做,取决于真机现在到底什么样。

我不凭推导投工。 你先看一眼,图上标题错了再动手;如果只是缩略图不理想,可能改个图就够。

② 百度 / 必应站点验证与地图提交(0.5 小时,需要你的账号)

两件事:一是把站长平台的所有权验证文件放到站点根目录(现在没有任何验证文件,只有公众号的);二是在平台里提交地图地址。

这两个平台不提交,做了地图也只是一个静态文件。需要你的账号登录,我可以代操作,但登录得你来。

③ 范围决策:预渲染要不要铺到其他页面(1–2 天)

现在只有文章页是机器能读懂的。列表页、产品页、服务页、「在做什么」页加起来还有约 50 个地址,仍然是空壳 —— 机器打开是一张白纸。

两条路:

  • 接受边界:先把文章做透,等其他页面内容稳定了再说。成本零。
  • 做统一层:把预渲染抽成模板层,所有页面共用。1–2 天,之后每加一个页面都自动合格。

这是范围决策,不是技术细节。我的倾向是选前者:内容还在动的时候做统一层,等于给一栋还在改户型的房子刷外墙。


六、遗留与观察点

  1. 见效周期:搜索引擎重新抓取、重新判断,以周计。观察两个指标就够 —— 地图的抓取状态、文章页被收录的条数。
  2. 情报日报是否收录:现在是关着的(开关常量 SITEMAP_INCLUDE_INTEL)。如果情报也想吃搜索流量,改成开即可,但会占掉地图里一大半条目。
  3. 缓存窗口:文章保存后最多 5 分钟内页面才更新(服务端缓存)。发文后立刻自查可能看到旧内容,不是故障。
  4. 其他搜索引擎未放行:神马、头条、360 的来源地址段没有加(对应的机器人识别规则也没认),所以它们来抓仍会被限流挡。这三家目前不是重点渠道,等真要做的时候再补,一次改两处。
  5. 地图与库的一致性:目前靠「最多 5 分钟」的容忍窗。若以后要发文立即可见,可以在后台保存时主动清一次缓存(需要改一处保存逻辑,半天)。
← 返回文章列表