CodeIgniter多语言路由404问题:URI-Language-Identifier库下无index链接无法访问
解决CodeIgniter URI语言标识下的路由404问题
这问题我之前在CodeIgniter项目里踩过坑,核心原因是路由匹配的顺序和单次替换机制在搞鬼!
问题根源
你当前的路由顺序是先处理通用语言前缀规则:
$route['(\w{2})/(.*)'] = '$2';
当访问localhost/en/pro/1时,这个规则会先把URI转换成pro/1。但CodeIgniter的路由匹配是一次性完成的——找到第一个匹配的规则替换后,就直接用这个结果去查找控制器和方法,不会再用新的URI去匹配后续的$route['pro/(:any)']规则。所以pro/1会被解析成「pro控制器的1方法」,而你的实际方法是index,自然就触发404错误了。
而访问localhost/en/pro/index/1时,替换后的URI是pro/index/1,CodeIgniter能直接找到pro控制器的index方法并传入参数1,所以能正常打开。
解决方案
调整路由顺序,把带语言前缀的特定路由规则放在通用语言路由的前面,让它优先被匹配。修改后的路由配置如下:
// 优先匹配带语言前缀的pro路由 $route['(\w{2})/pro/(:any)'] = 'pro/index/$2'; // 通用语言前缀规则(放在特定路由之后) $route['(\w{2})/(.*)'] = '$2'; $route['(\w{2})'] = $route['default_controller']; // 保留不带语言前缀的pro路由,适配无语言标识的访问 $route['pro/(:any)'] = 'pro/index/$1';
原理说明
- 当访问
localhost/en/pro/1时,第一个规则会直接匹配,将URI映射到pro/index/1,完美命中你的控制器方法和参数; - 其他带语言前缀的URL(比如
/en/about)依然会被通用规则处理,不影响原有功能; - 不带语言前缀的
/pro/1也能通过最后一条规则正常访问。
现在再访问localhost/en/pro/1,应该就能正常打开页面了,无需在URL中添加index。
内容的提问来源于stack exchange,提问作者AOWulin Guide
相关产品推荐
相关产品推荐

