插件窝 干货文章 CodeIgniter 3路由:如何区分大小写地匹配URL?

CodeIgniter 3路由:如何区分大小写地匹配URL?

CodeIgniter 3 路由配置 URL大小写 CI3路由 区分大小写    来源:    2025-07-07

CodeIgniter 3路由:如何区分大小写地匹配URL?

在使用CodeIgniter 3框架开发时,默认情况下路由是不区分URL大小写的。但有时我们需要严格匹配URL的大小写格式,本文将详细介绍如何实现这一需求。

1. CodeIgniter 3默认路由行为

默认情况下,CodeIgniter 3的路由系统对URL是不区分大小写的,这意味着以下URL都会被路由到同一个控制器和方法:

  • /controller/method
  • /Controller/Method
  • /CONTROLLER/METHOD

2. 实现区分大小写的路由匹配

要使CodeIgniter 3路由区分URL大小写,可以通过以下两种方法实现:

方法一:修改核心路由类

1. 创建MY_Router.php文件,放在application/core目录下

class MY_Router extends CI_Router {
    protected function _set_request($segments = array()) {
        // 调用父类方法
        parent::_set_request($segments);
        
        // 严格匹配控制器和方法名的大小写
        $this->class = $this->directory.$segments[0];
        $this->method = isset($segments[1]) ? $segments[1] : 'index';
    }
}

方法二:使用路由钩子

1. 在application/config/hooks.php中启用钩子:

$hook['pre_controller'][] = array(
    'class'    => 'CaseSensitiveHook',
    'function' => 'checkCase',
    'filename' => 'CaseSensitiveHook.php',
    'filepath' => 'hooks'
);

2. 创建CaseSensitiveHook.php文件,放在application/hooks目录下:

class CaseSensitiveHook {
    public function checkCase() {
        $CI =& get_instance();
        $class = $CI->router->class;
        $method = $CI->router->method;
        
        // 检查实际请求的URL是否匹配路由解析的大小写
        $uri = strtolower($CI->uri->uri_string());
        $expected = strtolower($class.'/'.$method);
        
        if ($uri !== $expected) {
            show_404();
        }
    }
}

3. 注意事项

  • 启用区分大小写后,请确保所有链接都使用统一的大小写格式
  • 可能会影响SEO,建议在.htaccess中统一规范化URL大小写
  • 测试所有现有URL以确保不会意外返回404错误

4. 结论

通过上述方法,您可以轻松实现CodeIgniter 3路由对URL大小写的严格匹配。根据项目需求选择合适的方法,方法一更彻底但需要修改核心类,方法二更灵活但会增加少量性能开销。