大家好,
我注意到从 WordPress 自动发布到 Discourse(用作评论区)的旧帖子存在一个奇怪的问题。
通常情况下,以这种方式发布帖子时,Discourse 会正确地在 HTTP 头中添加 X-Robots-Tag: noindex,并将 canonical URL 设置回指向 WordPress 博客文章。
然而,我发现较旧的帖子正在丢失这些标签。noindex 头消失了,canonical 标签也不再存在。以下是出现此问题的一些帖子示例:
有人知道如何解决这个问题吗?
请注意,我无法确切知道目前有多少帖子受到了影响,但看起来数量相当多。
如果能在分类(或标签?)设置中有一个复选框,启用后自动为在该分类下发布的所有帖子添加 noindex,那就太好了。类似于:
[ ] 在搜索结果中隐藏此分类下的帖子。
嗨,Angus!
是的,没错。
“嵌入设置规范 URL”也已启用:
你 可以在此处看到,新主题发布时带有 noindex 和 canonical 标签。但我发现旧主题缺少这些标签。
angus
(Angus McLeod)
4
Thiago,如果你有服务器访问权限,能否请找一个规范 URL 无法生效的主题,获取其 ID,然后在 Rails 控制台中运行以下命令,并分享结果。
./launcher enter app
rails c
TopicEmbed.with_deleted.find_by(topic_id: 在此处添加主题 ID)
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:73608)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:79015)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:74248)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:76598)
=> nil
angus
(Angus McLeod)
6
这就是问题所在。为了让嵌入功能的规范 URL 正常工作,主题必须拥有 topic_embed 记录。你能想到这些主题可能没有嵌入记录的任何原因吗?
说实话,我不清楚是什么导致这些主题缺失了它们的 topic_embed 记录。
但从整体来看,采用我之前建议的配置岂不是更合理?如果我们在分类设置中直接添加一个复选框,以便为该分类下的所有主题应用 noindex,我们就不必依赖嵌入功能,也不必担心这些记录是否存在了。
angus
(Angus McLeod)
8
虽然这对您的网站来说可能合理,但这与主题嵌入的规范 URL 工作方式属于不同的功能。您可以自行构建,但需要将其作为自定义插件来实现。
嵌入功能的规范 URL 按预期工作,但似乎您的网站在某处删除了嵌入记录,或执行了其他操作。Discourse 不会硬删除主题嵌入记录,因此一定发生了其他情况。除非您进行一些自定义开发,否则您需要重新发布这些主题以重新创建嵌入记录。
虽然这与主题嵌入的行为不同,但类别级别的索引控制是任何现代内容管理系统(CMS)的基本 SEO 需求。关于这一点已有多个 Meta 主题讨论,将其原生化将一次性解决多种用例。
我可能会尝试利用 AI 开发一个插件,因为 Ruby 并非我的技术栈,但这确实应该作为一个原生功能实现。
关于缺失的记录:我们并未执行任何可能导致此问题的数据库命令或操作。此外,重新发布并不可行。我们拥有近 5 万篇帖子,甚至不清楚哪些受到了影响。要解决这个问题,需要编写复杂的 API 脚本来查找、删除并重新发布所有内容……
Slate
(Slate )
11
插件做得不错。对于仍需要找出哪些现有主题丢失了标头的用户,可以从外部进行检查——无需 Rails,无需数据库:
curl -s https://EXAMPLE.COM/sitemap_1.xml \
| grep -o 'https://[^<]*/t/[^<]*' \
| while read -r u; do
curl -sI "$u" | grep -qi 'x-robots-tag: *noindex' || echo "$u"
done > missing-noindex.txt
sitemap.xml 通常是一个指向子站点地图的索引,因此请先展开它们,然后针对每个子站点地图运行此命令。如果你的网站有限速,请添加 sleep。
有一点值得为后来者单独说明:标头和规范链接是两个独立的信号,它们会独立失效——一个主题可能会丢失 X-Robots-Tag 但保留正确的规范链接,或者反之。请同时检查两者:
curl -sI URL | grep -i x-robots
curl -s URL | grep -i 'rel="canonical"'