别名与cultureKey上下文冲突:以de开头别名触发德语404问题修复咨询
修复MODX中以"de"开头的别名触发德语上下文404的问题
问题:当任意上下文的别名以“de”开头(例如
development-of-documentation)时,页面会跳转到德语(de)上下文的404页面,确认是cultureKey的de匹配逻辑导致的问题。
原上下文切换代码
<?php if($modx->context->get('key') != "mgr"){ switch ($_REQUEST['cultureKey']) { case 'ru': $modx->switchContext('ru'); break; case 'it': $modx->switchContext('it'); break; case 'fr': $modx->switchContext('fr'); break; case 'de': $modx->switchContext('de'); break; case 'es': $modx->switchContext('es'); break; case 'uk': $modx->switchContext('web'); break; case 'ua': $modx->switchContext('web'); break; default: $modx->switchContext('en'); break; } unset($_GET['cultureKey']); }
问题根源
MODX的路由解析逻辑存在前缀匹配漏洞:当URL路径中某段以de开头时,系统错误地将其识别为cultureKey=de,触发德语上下文切换,而该路径在德语上下文不存在,直接返回404。原代码的switch是精确匹配,但路由层的规则可能将任意以两位语言代码开头的路径段都解析为cultureKey。
修复方案
方案1:修改路由规则(推荐)
调整.htaccess中的Rewrite规则,确保cultureKey仅匹配URL开头的精确两位语言代码,而非前缀:
# 替换原有语言路由规则 RewriteRule ^([a-z]{2})(?:/(.*)|)$ index.php?q=$2&cultureKey=$1 [L,QSA]
该规则仅在URL开头是精确的两位语言代码(如de/或de)时,才会将其设为cultureKey,以de开头的别名路径不会被误识别。
方案2:增强PHP代码校验逻辑
如果无法修改路由,就在上下文切换代码中增加双重校验:确认cultureKey是合法值,且确实是URL的第一个路径段:
<?php if($modx->context->get('key') != "mgr"){ // 定义合法的语言key列表 $validCultureKeys = ['ru', 'it', 'fr', 'de', 'es', 'uk', 'ua']; $cultureKey = $_REQUEST['cultureKey'] ?? ''; // 获取URL的第一个路径段 $requestUri = $_SERVER['REQUEST_URI']; $path = trim(parse_url($requestUri, PHP_URL_PATH), '/'); $firstSegment = explode('/', $path)[0] ?? ''; // 仅当cultureKey合法且是第一个路径段时,才执行上下文切换 if(in_array($cultureKey, $validCultureKeys) && $firstSegment === $cultureKey){ switch ($cultureKey) { case 'ru': $modx->switchContext('ru'); break; case 'it': $modx->switchContext('it'); break; case 'fr': $modx->switchContext('fr'); break; case 'de': $modx->switchContext('de'); break; case 'es': $modx->switchContext('es'); break; case 'uk': case 'ua': $modx->switchContext('web'); break; default: $modx->switchContext('en'); break; } } else { // 非法的cultureKey,切换到默认英文上下文 $modx->switchContext('en'); } unset($_GET['cultureKey']); }
内容的提问来源于stack exchange,提问作者Lost Svan
相关产品推荐
相关产品推荐

