从URL中删除ID(类别和文章)(Joomla 3.3 / 3.4 / 3.5)

时间:2014-10-02 19:50:22

标签: php .htaccess joomla joomla3.3 joomla3.4

我有一个Joomla 3.3.6(已编辑:3.5.)网站,只有3个级别:

  • 四大类别(i,ii,iii,iiii)
  • 每个分为一些中间类别(A,B,C,...)
  • 最后文章
  • 两种语言(en,pt)

设置URLSearch Engine Friendly URLsUse URL rewritingAdds Suffix to URL 之后的multilanguage support形式如下:

http://www.example.com/en/bigcatiii/intercatA/articlex.html

但是,自从Joomla-Baby-Version以来,有许多其他人安装了Joomla并要求解决方案,我得到了:

http://www.example.com/en/bigcatiii/666-intercatA/articlex.html

其中666是来自地狱的数字,表示类别ID

现在正在浏览答案,我找到了答案:

 Edit “components/com_content/router.php“
 (You’ll probably have to re-do this step every time you update Joomla.)
 Replace the lines 38 and 290 with:
 $advanced = $params->get('sef_advanced_link', 1);

 and Replace line 426 with
 ->where($db->quoteName(‘alias’) . ‘ = ‘ . $db->quote($segment)); 

嗯,首先,第426行已经像原版中那样了。其次,这不是诀窍。它适用于:

http://www.example.com/en/bigcatiii/intercatA/articlex.html

但是,如果您浏览到:

,则会出现 404 错误

http://www.example.com/en/bigcatiii/intercatA.html

另外,我注意到 ID 数字不同。虽然整个网址是

http://www.example.com/en/bigcatiii/666-intercatA/articlex.html

相同的类别描述页面是

http://www.example.com/en/bigcatiii/333-intercatA.html

根据 .htaccess

,还有另一种解决方案听起来更好,但也行不通
RewriteEngine on
RewriteBase /
RewriteRule (\d+)-([^/]*) $2 [R=301,L]

URLs显示正常,但找不到页面。如果我们能够使用 .htaccess 提供解决方案而不是更改Joomla核心,那将会好得多。

然而,如果其他googled建议有效,更改Joomla核心也不错。

 Copy “components/com_content/router.php” to “/templates/your-template/html”

这意味着,一旦您将router.php移动到本地",您就不需要在升级后重做所有内容。 (当然,除非你更新了router.php,以防你再次镜像它。)

感谢您抽出宝贵时间来解决这个难题!

参考

1- Change/ Remove Article ID in URL?

2- Removing the Article ID number

3- How to remove article id in url?

4- Remove article id from url for joomla 3.0

5- Enabling SEF

6- Remove article id from joomla 3 URL

7- Remove article id from joomla 3 URL

8- .htaccess redirect rule

9- Test .htaccess


已编辑(2016年/月/ 02日):Joomla最新版本3.5的新赏金

3 个答案:

答案 0 :(得分:2)

我刚刚新安装了joomla 3.5,旧方法适用于我。由于在路由器文件中修改了某些内容,因此必须在joomla升级后重复此过程。

./components/com_content/router.php中的行现在是34和295。

再次将0更改为1,使其变为:

$advanced = $params->get('sef_advanced_link', 1);


我的网址是例如http://joomla.lan/en/category-en-gb/article-en-gb 适用于Search Engine Friendly URLs on。

Adds Suffix to URL切换为Yes后,.html会附加到网址上 Use URL RewritingUnicode Aliases可选地工作。在IIS7或Apache上使用URL重写引擎时,您必须将htaccess.txt重命名为.htaccess,将webconfig.txt重命名为webconfig。请注意,某些主机具有限制性服务器配置。如果您获得500 internal server error,则可能需要修改.htaccess,并通过添加前一行注释掉Options +FollowSymlinks行和/或Options -Indexes和/或RewriteBase / #。后者已在Joomla 3.5中停用。当Joomla安装在子文件夹中而不是Web根目录时,RewriteBase设置很有用。

在其他服务器上将Use URL Rewriting设置为No

我无法重现您的问题,使用这两个代码编辑一切正常。请再试一次,如果你无法解决,请发布确切的行为(网址,错误aso。) 如果您无法修复它,则可能必须重新安装源。

答案 1 :(得分:1)

在研究之后,我发现了一些有用的信息。 免责声明我没有使用Joomla,并且没有在工作安装上试过这个,这些只是一些搜索和结果的结果。阅读源代码。无论如何,这是我找到的。

从我收集到的内容来看,似乎正在改变

$advanced = $params->get('sef_advanced_link', 0);

$advanced = $params->get('sef_advanced_link', 1);

应该足够了。 小心但,使用此选项,可能两个URL(有和没有ID)都可用,这对SEO不利。问题在于404,但这似乎是Joomla路由系统的一个问题。您可以使用仅配置但从未使用的菜单链接补偿404s(见下文)。

问题的一些根源:

  • 例如,在他们的路由中,他们使用菜单查找类别ID(Line ~385 // We get the category id from the menu item and search from there
  • 对于每个URL段(由/分隔),它们首先搜索类别别名,因此请务必检查别名。如果他们无法在类别中找到别名,他们会依赖网址中的ID作为搜索查询(Line ~425 ->where($db->quoteName('catid') . ' = ' . (int) $vars['catid'])
  • 当categoryID或articleID附加到菜单时,他们会删除类别ID $query['catid'],因为他们知道他们有唯一的全局别名(Line~69)

因此,一种解决方案是执行以下操作:

您可以尝试为每个类别和每篇文章创建一个菜单项。即使菜单没有在任何地方显示并且只在管理界面中配置,它也会为类别和文章创建全局唯一的路由别名,这将让Joomla找到正确的文章/类别。据我所知,当一个类别或文章有一个菜单项时,只使用标题别名。但由于他们没有,他们使用id + slug的组合来定位资源。

由于很多人都抱怨这个,所以 应该在Joomla 3.5中修复

参考文献&讨论:

要完成一个明亮的音符,似乎是the developers are aware of the limitations;)

答案 2 :(得分:0)

另一种简单的解决方案是创建一个菜单项作为类别博客,并使用别名作为您的类别。

它不会删除您网站中的URL,但是您仍然可以将XML站点地图发送给搜索引擎,而无需使用带有ID的那些类别的URL

相关问题