Joomla升级到3.4.x之后的link rel canonical处理方案

把几个Joomla站点的程序从3.3.6升级到3.4.3之后,发现之前能正常显示的<link href=“” rel="canonical"/>都不在了。查看了/plugins/system/sef/sef.php之后,发现在网页头部加入canonical的条件变成了:
if ($uri->toString() !== $link)
也就是说当访问的链接是一个不规范链接时候,Joomla 3.4.x才会在页面源代码中插入<link rel="canonical" href...当然,这样的设计没有什么问题,但是实际测试结果却是——然并卵。
比如本篇的规范链接应该是:
http://www.onepx.com/joomla-34x-link-rel-canonical.html
如果不做修改,在网页源文件中是看不到link canonical的。我在这个链接后面加点东西,如:
http://www.onepx.com/joomla-34x-link-rel-canonical.html?ranbingluan
页面照常打开,这个时候查看页面源代码会发现头部多了一行:
<link href="http://www.onepx.com/joomla-34x-link-rel-canonical.html?ranbingluan=" rel="canonical"/>
不显示canonical就算了,也别显示错误的链接来误导搜索引擎啊。下面是我的处理方案,找到/plugins/system/sef/sef.php,注释或者删除下面几行:
if ($uri->toString() !== $link)
{
$doc->addHeadLink(htmlspecialchars($link), 'canonical');
}
因为我有使用sh404sef这个组件,也发现页面源代码头部中的<base href=“”/>一直都“非常正确”的显示着规范链接,所以我决定做一个小小的修改。找到/libraries/joomla/document/html/renderer/head.php,里面有关于在头部中插入<base href=“”/>的部分,大致如下:
// Generate base tag (need to happen early)
$base = $document->getBase();
if (!empty($base))
{
$buffer .= $tab . '<base href="' . $document->getBase() . '" />' . $lnEnd;
}
在$buffer下面再添加一行:
$buffer .= $tab . '<link rel="canonical" href="' . $document->getBase() . '" />' . $lnEnd;
好了,现在再来看看本页的网页源文件,<link rel="canonical" 是不是乖乖的呆在<base href=“”的下面?