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

Dr *_*eco 17 php .htaccess joomla joomla3.3 joomla3.4

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

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

URL设置后Search Engine Friendly URLs,Use URL rewriting,Adds Suffix to URLmultilanguage 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)); 
Run Code Online (Sandbox Code Playgroud)

嗯,首先,第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]
Run Code Online (Sandbox Code Playgroud)

URLs出现确定,但页面没有找到.如果我们可以使用.htaccess提供解决方案而不是更改Joomla核心,那将会好得多.

如果其他Google搜索的建议有效,那么改变Joomla核心就可以了.

 Copy “components/com_content/router.php” to “/templates/your-template/html”
Run Code Online (Sandbox Code Playgroud)

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

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

参考

1-更改/删除URL中的文章ID?

2-删除文章ID号

3-如何删除url中的文章ID?

4-从jolla 3.0的url中删除文章ID

5-启用SEF

6-从joomla 3 URL中删除文章ID

7-从joomla 3 URL中删除文章ID

8- .htaccess重定向规则

9-测试.htaccess


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

ach*_*zot 1

经过一番研究,我发现了一些有用的信息。免责声明我不使用 Joomla,也没有在工作安装上尝试过,这些只是一些搜索和阅读源代码的结果。无论如何,这就是我发现的。

据我所知,似乎正在改变

$advanced = $params->get('sef_advanced_link', 0);
Run Code Online (Sandbox Code Playgroud)

$advanced = $params->get('sef_advanced_link', 1);
Run Code Online (Sandbox Code Playgroud)

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

你的问题的一些根源:

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

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

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

由于很多人抱怨这个问题,应该在 Joomla 3.5 中修复它

参考文献和讨论:

最后,开发人员似乎意识到了这些限制;)