Joomla4.x对URL路由系统做了一些调整,这些调整是不兼容J3的。在做J3升级到J4的过程中,对于一些URL,在升级完成后可能会出现404,提示页面找不到。

1,URL路由系统的改变

Joomla4的路由系统已经和joomla3不兼容了,虽然做了大量的兼容,但还是会出现一些页面找不到的情况。特别是这些链接是手动输入的。

下面是一个典型的例子:

http://old.epd.com/tc/sub-download/sub-air-quality-reports/dioxinshk

 在升级到j4.x之前,这个链接是没有问题的,可以正常访问。但升级之后,就会出现404的问题。开始调试模式,追踪代码,发现最终报错点为JROOT\libraries\src\Router\Router.php:155

Page not found
E:\wamp\www\aqhiv4\libraries\src\Router\Router.php:155

Call stack
#	Function	Location
1	()	JROOT\libraries\src\Router\Router.php:155
2	Joomla\CMS\Router\Router->parse()	JROOT\libraries\src\Application\SiteApplication.php:746
3	Joomla\CMS\Application\SiteApplication->route()	JROOT\libraries\src\Application\SiteApplication.php:232
4	Joomla\CMS\Application\SiteApplication->doExecute()	JROOT\libraries\src\Application\CMSApplication.php:293
5	Joomla\CMS\Application\CMSApplication->execute()	JROOT\includes\app.php:61
6	require_once()	JROOT\index.php:32

2,为何会出现问题

在升级前处理URL路由的方案是先将整个的URL进行分割,然后采用贪心模式匹配对应的菜单项。在上面的URL,会采用最佳匹配,匹配到二级子菜单。但升级到Joomla4后,系统没有采用贪心模式,虽然也匹配到了菜单,但是匹配的菜单项是一级菜单项。匹配完成后,就没有继续处理,转而将剩余的参数传递到了下一个路由。由于下一个路由没有处理多余的参数,导致出现404的问题。具体的代码如下:

   public function parse(&$uri, $setVars = false)
    {
        // Do the preprocess stage of the URL parse process
        $this->processParseRules($uri, self::PROCESS_BEFORE);

        // Do the main stage of the URL parse process
        $this->processParseRules($uri);

        // Do the postprocess stage of the URL parse process
        $this->processParseRules($uri, self::PROCESS_AFTER);

        // Check if all parts of the URL have been parsed.
        // Otherwise we have an invalid URL
        if (\strlen($uri->getPath()) > 0) {
            throw new RouteNotFoundException(Text::_('JERROR_PAGE_NOT_FOUND'));
        }

        if ($setVars) {
            $this->setVars($uri->getQuery(true));

            return $this->getVars();
        }

        return $uri->getQuery(true);
    }

 3,如何解决此类问题

发生此类问题,并不是这个URL真的不存在,而是在处理路由的时候出现了异常抛出了这个404错误。我们需要做的就是开发一个定制的路由插件,来修正系统对此类URL路由错误的bug.在升级的过程中,我们团队经常遇到这类问题,因此,专门开发了插件。用户只需要启用我们开发的兼容插件,就可以不用手动调整代码,非常的方便。有需要的朋友可以联系我们。本插件并没有上传到应用市场中。

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前