我的域名上有几个重复页面,我需要通过 JavaScript 将重复页面的 canonical 标签指向原始页面。(删除重复页面不可行,因为它们有相当大的流量)
有人能建议在 Discourse 中如何使用 JavaScript 更新 a 标签吗?
给你 @KranthiKiranGude,这是在 JavaScript 中更改 href 属性的方法。首先选择 DOM 元素,然后修改属性。
<script>
var uC = document.querySelectorAll("link[rel='canonical']")[0];
var newURL = "https://my.coolforum.com/newlink";
uC.setAttribute("href", newURL);
</script>
当然,你需要根据要操作的目标页面添加一些逻辑。
通用示例逻辑:
<script>
if("the_actual_page_url_or_id" == "my_interesting_page_url_or_id")
{
var uC = document.querySelectorAll("link[rel='canonical']")[0];
var newURL = "https://my.coolforum.com/newlink";
uC.setAttribute("href", newURL);
}
</script>
希望这能帮到你。
嗨 @neounix,
我试了你的代码,但没有更新 href,而是生成了一个新的 script 标签:
![]()
我已在“/head”部分更新了此脚本。
请提供你使用的确切代码以及具体添加位置,包括你提到的 <head> 部分中条目的截图。
谢谢!
当你添加更多 JavaScript 时,生成新的 JavaScript 代码是正常的。
顺便提一下,你需要在 Web 开发控制台的 DOM(元素)中检查,而不是在页面源代码中检查。
我明白了。
顺便说一下,你的脚本条件语句中缺少一个起始引号……
你好 @neounix,
在开发者控制台中它确实有效。但在页面源代码中,它仍然引用实际 URL。
如果我没理解错的话,搜索引擎会从页面源代码而非 DOM 元素中抓取内容。如果我说错了,请纠正我。
老实说,我也不太确定。我之前一直以为现代搜索引擎(如 GoogleBot)会读取 DOM,但现在仔细一想,搜索引擎可能只读取源代码而不读取 DOM,这也合情合理。
不过……当我在 Google 上搜索验证这一点时,结果显示:
DOM 中的 SEO 信号(页面标题、元描述、规范标签、元 robots 标签等)会被尊重。动态插入到 DOM 中的内容也可被爬虫抓取和索引。此外,在某些情况下,DOM 信号甚至可能优先于 HTML 源代码中的矛盾声明。这需要更多工作,但在我们的多项测试中确实如此。
参考资料:
https://searchengineland.com/tested-googlebot-crawls-javascript-heres-learned-220157
你好 @neounix,
非常感谢你的帮助。我也会在这方面进行调研。再次向你表示感谢。
欢迎!
请回复并告知我们您的研究成果。
另一种方法是我最近在业余时间一直在研究的,即直接修改这个 Discourse Ruby 库文件:
如果您在使用 DOM 操作 JS 技术方面没有进展,@KranthiKiranGude,您可以考虑类似的方法。
你好 @neounix,
我使用 URL 检查工具测试了该页面,Google 已识别出更新后的 URL。
太好了……很高兴听到它奏效了。
感谢测试并反馈。
附注:那个 JS DOM 方法比操作 canonical_url.rb 要简单得多 ![]()
我不确定通过 JavaScript 覆盖 canonical 标签是否有效,因为这更多是蜘蛛(spider)层面的问题(即负责检索和收集数据的部分),而不是索引器(indexer)层面的问题(即负责解释数据并将其存储到搜索索引中的机器人部分)。
未经请求的建议:你可能想阅读这个主题,以便将那些覆盖操作放入插件中:
是的,我也不确定。这个问题目前尚无定论。
不过,关于这个话题的 Google 搜索结果非常丰硕。许多人都在这样做,其中许多人表示 Google 会尊重 DOM 的更改(当然也有人持相反意见,因此似乎并没有形成强烈或压倒性的共识)。例如,可以参考:
我认为,如果我要这么做,我会(1)先从页面源代码中删除原始的规范链接标签,然后(2)使用 JavaScript 在 DOM 中插入一个新的规范链接标签。
随后,随着时间的推移,我们可以直接查看 Google 搜索控制台,看看 Google 最终选择了哪个作为规范链接。
另请参阅:
由于许多人认为这对 SEO 至关重要,结合 @KranthiKiranGude 的确认,我再次对此进行了核查。
根据 developers.google.com 的说明,了解 JavaScript SEO 基础知识:
Googlebot 支持 Web 组件。当 Googlebot 渲染页面时,它会扁平化影子 DOM 和轻量级 DOM 内容。这意味着 Googlebot 只能看到渲染后 HTML 中可见的内容。为确保 Googlebot 在页面渲染后仍能看到您的内容,请使用 移动设备友好型测试 或 URL 检查工具 并查看渲染后的 HTML。
因为 (1) @KranthiKiranGude 在其测试中使用了 URL 检查工具,且 (2) 他确认通过这种方式规范链接已按预期更改,因此可以推断,根据 Google 的说法,Googlebot 确实能够“看到”并在页面渲染后注册此 DOM 内容变更。
参考:
是的,我完全支持 Google 在索引时像那样扁平化 DOM 内容的做法。
但有些(或大多数)meta 标签的语义位于 HTTP 协议层面,而非 HTML 协议层面,尽管它们确实存在于 HTML 中。我之所以强调“在索引时”,是因为我不确定 Google 在抓取时是否也会以这种方式扁平化 DOM,并考虑更新后的规范 URL。
(换句话说,我不确定 DOM 内容是否也包含“嵌入在内容中的元数据”。它确实是以这种方式“看到”这些内容的,但我不确定它是否会以这种方式“使用”它们)。
也许这篇文章能更好地解释这一点:How Google Crawls Your Website and Indexes Your Content
当 Google 需要抓取 JavaScript 网站时,传统 HTML 内容不需要的额外阶段是必需的。这被称为渲染阶段,需要额外的时间。索引阶段和渲染阶段是独立的阶段,这使得 Google 可以先索引非 JavaScript 内容。
并不完全是,抱歉。那篇来自 www.hillwebcreations.com 的文章甚至没有提及 DOM、如何检查 DOM 等内容,至少在我看来,它读起来“过时且带有主观色彩”(既不够新,也不够客观)。
就我个人而言,我更推荐以下两篇撰写精良的参考资料,它们在我看来更具权威性、更客观且引用充分:
以及第一篇,其中他们实际进行了测试(而且那是在 GoogleBot 切换到基于 Chromium 的核心之前,那时它就能更好地读取 DOM(JavaScript)了):
我们测试了 Googlebot 如何抓取 JavaScript,并得出了这些结论
经过我的研究,我倾向于认同 Google 开发人员的观点:他们会对通过“网址检测工具”(URL Inspection Tool)所发现的内容进行索引(并从中获取 SEO 信号)。因此,我们可以据此“判断”SEO 信号和内容。Google 的讨论清晰、客观、权威且不含推测。
由于 @KranthiKiranGude 已确认其规范链接已通过“网址检测工具”更新,而 Google 作为权威机构表示,从 SEO 角度了解 Google 如何看待某个页面,“只需”使用这一工具即可。
技术总结
因为 Google 从“网址检测工具”可见的内容中获取 SEO 信号;Google 开发人员已明确说明其 SEO 信号可直接通过“网址检测工具”进行分析;并且 @KranthiKiranGude 对 DOM 所做的 JavaScript 更改在“网址检测工具”中可见,那么在我看来,这“已经足够好了”。
希望这能帮到你。
是的,那篇文章确实明确指出,他们看到动态插入的规范标签的行为与直接写在源代码中完全一致。你说得对(我应该在第一次你发布时更仔细地阅读这篇文章)。
不过,你在这个主题中提到的四个页面中的三个,包括提供答案的那个,甚至比我发布的那篇文章还要早呢 ![]()
[quote=“RGJ, 帖子:18, 主题:159527”]
是的,那篇文章确实明确指出,他们看到动态插入的规范标签表现得与直接写在源代码中完全一样。你是对的(我本该在你第一次发布时更仔细地阅读)。[/quote]
顺便一提 @RGJ,关于“非当前”这个说法造成的混淆,很抱歉……
当我使用“过时”或“非当前”这个词时,我指的是概念和思想,而不是任何文章的物理日期。
有些人写的文章虽然标注的是“今天”的日期,但其概念却是“过时”的(甚至是错误的);而有些人十年前写的文章,至今仍然高度相关。
这就是我所说的“过时”或“非当前”的含义:它基于“概念”,而非写在纸面或网页文章上的物理日期。如果我这样使用这些术语造成了任何困惑,敬请谅解。
至少在我看来,重要的是我们已为 @KranthiKiranGude 提供了解决方案,他确认该方案有效。基于你带有怀疑态度的帖子,我们双方都针对此问题进行了额外的研究。
我们验证了:(1) 使用 JavaScript 更改规范链接的方法是有效的;(2) Google 开发者已确认这一点;(3) 我们作为用户也有办法进行验证,即使用 URL 检查工具(正如 @KranthiKiranGude 所做并与我们分享的那样)。
祝一切顺利,非常感谢你们在这个有趣的话题上进行的“来回讨论”,也感谢你们帮助使该解决方案更加有效和可靠。
我要去处理其他任务了(在写了十多年 PHP 代码后,我仍在努力自学 Ruby on Rails);毕竟这个话题已经“任务完成”了 ![]()
下次再会……祝一切顺利!
