【问题标题】:Get rid of ID (category and article) from URL (Joomla 3.3 / 3.4 / 3.5)从 URL (Joomla 3.3 / 3.4 / 3.5) 中删除 ID(类别和文章)
【发布时间】:2014-11-27 21:30:45
【问题描述】:

我有一个Joomla 3.3.6(编辑:3.5.)网站,仅分为 3 个级别:

  • 四大类(i、ii、iii、iii)
  • 每一个都分为一些中间类别(A、B、C、...)
  • 最后是文章
  • 两种语言(英文、英文)

设置Search Engine Friendly URLsUse URL rewritingAdds Suffix to URLmultilanguage support后的URL应该为:

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 核心来提供解决方案,那就更好了。

不过,如果其他谷歌搜索的建议是有效的,那么更改 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/May/02):Joomla 最新版本 3.5 的新赏金

【问题讨论】:

  • 期待找到有答案的温柔灵魂……
  • 在等待了几个星期的答案后,赏金被取消并再次(自动)重新启动。现在只有 4 小时来奖励赏金,我没有带我的 Joomla,也没有时间检查这个答案是否符合要求。因此,关于未经检查的答案的准确性,我决定根据努力的优点来奖励赏金。如果发现是错误的,我会要求作者编辑。如果接下来几天有其他更好的答案,我只能更改接受的答案。非常感谢您的努力,@achedeuzot。
  • 我现在正在等待更好的答案。这仍然是一个问题吗?有没有更好、更简单的解决方案?
  • 这个答案对于 Joomla 3.4 还可以吗?有更好的解决方案吗?
  • 你在 joomla.stackexchange.com 上发布过这个吗?您可能会发现 joomla 专家更有能力做出回应。

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


【解决方案1】:

我刚刚安装了 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-gbSearch Engine Friendly URLs 一起工作正常。

Adds Suffix to URL 切换到 Yes 后,.html 将附加到 URL。
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


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

【讨论】:

  • 感谢您花费时间和精力帮助回答此问题。我会根据您的解释授予您赏金(在到期之前),但我不会将其设置为已接受的答案。我相信,如果您说的话,我会保留旧答案作为接受。再次发送。
  • 正如您所说,您正在使用 URL 重写引擎,这对 IIS7 和 Apache 有什么好处。您是否记得将 htaccess.txt 重命名为 .htaccess?我将这一点添加到答案中。
【解决方案2】:

在查看之后,我发现了一些有用的信息。 免责声明 我没有使用 Joomla,也没有在安装时尝试过,这些只是一些搜索和阅读源代码的结果。不管怎样,这就是我找到的。

从我收集到的情况来看,似乎正在改变

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

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

应该够了。 要小心,使用此选项,可能两个 URL(带和不带 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']))
  • 当 categoryID 或 articleID 附加到菜单时,他们会删除类别 ID $query['catid'],因为他们知道自己有一个唯一的全局别名(第 ~69 行)

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

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

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

参考与讨论:

以一个明亮的音符结束,似乎the developers are aware of the limitations ;)

【讨论】:

  • 好的,谢谢!现在,根据您的理解,如果我保证我的类别别名彼此不同,您能否提供一个简单的技巧,让 Joomla 在此用户保证下工作? (我知道这个解决方案不会是我们在 Joomla 3.5 的主卡车上看到的,因为你不能把这个责任交给用户,但作为一种解决方法,我会自己承担这个责任,而新版本不是可用)
  • 我不知道我理解你的问题,但你有两种可能性:创建一个具有唯一别名的隐藏菜单,以便 Joomla 有这个“查找表”,或者你可以尝试“强制”取消设置 @987654330 @ 在路由器中,但您必须明确测试以确保它不会阻止其他任何东西。很抱歉,我手头没有安装来测试它,而且我离 Joomla 专家还很远;)
  • 它在 Joomla 3.4.1 中不起作用。我只需要从类别中删除第一个 ID。
  • 基本问题是子类别和所有内容类型(不仅仅是文章,您使用任何组件创建的任何内容)的重复名称的问题。如果您保证永远不会重复这些,您可以制作唯一的网址。问题是检查所有单独表之间的唯一性非常困难。好消息是,在每个类别分支中,您都可以保证唯一的类别名称,因此有 2 个类别级别,它可以保证是唯一的。这就是为什么整个事情需要重写,否则你需要使用 SEO 组件。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 2014-07-20
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多