如何去除Joomla 3网站静态化URL地址中的分类ID和文章ID
2015-10-01 by Vincent Ping目前本站使用工具直接生成静态页面,不再使用Joomla!,此处保留原文,仅供参考。
一、问题
我的站点vincentping.com是使用Joomla 3.4.4版本管理的,Joomla是一个非常专业的网站内容管理系统(CMS),但是其在SEO搜索引擎优化后的URL模式上有一些不足。
我首先创建了一些分类和文章,然后在系统管理后台的"Global Configuration"设置"SEO Settings"。其中的选项
- Search Engine Friendly URLs 设为 Yes
- use URL Rewriting 设为 Yes
- Adds Suffix to URL 也设为 Yes
如下图:
这个时候访问站点,文章的URL地址变成如下这样的形式:
http://www.vincentping.com/cn/8-blogcn/14-remove-category-article-id-from-url-in-joomla-3-cn.html
相对于原来没有SEO优化前的地址:
http://www.vincentping.com/index.php?option=com_content&view=article&id=14:remove-category-article-id-from-url-in-joomla-3-cn&catid=8&lang=cn
上面的优化地址要好得多了,但是还有一些小小的不爽,比如在分类前的8-和文章名之前的14-。很显然这些数值都是数据库中的ID值,这样程序在查找后台数据库时,有了这些值会更加高效,但是对于普通访问者来说,这些数值就显得有些奇怪,而且会让站点显得不够专业,不够”高大上“!
怎么办呢?经过在google上查询,网上有大量的相关讨论。经过不断地摸索和尝试,下面是我最终使用的解决办法。
二、解决方法
-
在Joomla系统的目录下,找到下面php文章:“components/com_content/router.php“;
-
查找到下面代码:
$advanced = $params->get('sef_advanced_link', 0);
-
把其中 "0" 改为 "1",修改结果如下:
$advanced = $params->get('sef_advanced_link', 1);
在这个router.php文件中共有两处需要修改的地方。
-
继续在该router.php文件中,找到下面的代码段,然后注释掉:
if (strpos($segments[0], ':') === false) { $vars['view'] = 'article'; $vars['id'] = (int) $segments[0]; return $vars; }
注释成:
/* if (strpos($segments[0], ':') === false) { $vars['view'] = 'article'; $vars['id'] = (int) $segments[0]; return $vars; } */
然后整个修改就完成了!
这个时候,该页面的URL地址变成:
http://www.vincentping.com/cn/remove-category-article-id-from-url-in-joomla-3-cn.html
提示:一旦以后Joomla版本升级,上述的修改可能被覆盖,就需要重新做。
三、一些其他可以尝试的方法
我在网络上搜索解决方法时,发现这个URL中数值问题对于Joomla社区已经是一个很”古老“的问题了,但是在核心代码中一直没有得到解决。所以市面上已经出现了许多的解决办法。下面这些方法都可以试试:
- 使用第三方的SEF扩展,比如Sh404SEF,JoomSEF和SEF Advance等。可以到JED(Joomla! Extensions Directory) 搜索”SEF“,就可以找到很多类似扩展。扩展的问题是很多需要付费,会增加服务器负担,而且升级和维护起来也是个问题。
- 如果你对正则表达式比较熟悉,可以在.htaccess文件中增加解析和重定向规则来解决这些问题。当然使用太多.htaccess规则是会影响服务器效率的。
- 最后,如果你的站点不大,文章也不多,那么可以像上面介绍的建立菜单项的方法,为每篇文章都建立一个菜单项,这个文章数值问题也能完全解决。
如果想继续仔细研究下这个URL中的文章ID数值问题,推荐大家可以看看这个在Joomla官方论坛上的帖子:"Remove article id from url for joomla 3.0"。