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.在升级的过程中,我们团队经常遇到这类问题,因此,专门开发了插件。用户只需要启用我们开发的兼容插件,就可以不用手动调整代码,非常的方便。有需要的朋友可以联系我们。本插件并没有上传到应用市场中。
评论 (0)