CodeIgniter静态URL重写:将users/login替换为usuarios/login
嘿,我来帮你搞定这个需求!要把/users/login这类URL映射到/usuarios/login,其实用CodeIgniter自带的路由系统就能轻松实现,不用折腾服务器的复杂重写规则(当然如果已经配置了隐藏index.php的规则,两者也完全兼容)。下面分场景给你详细说明:
方法一:用CodeIgniter路由系统实现核心映射
首先打开项目根目录下的application/config/routes.php——这是CodeIgniter管理路由的核心配置文件,所有URL映射规则都在这里定义。
1. 单条路径精确匹配
如果你只需要处理/users/login这一个特定路径,直接在文件里添加这条规则:
$route['usuarios/login'] = 'users/login';
这样用户访问http://localhost/myapp/index.php/usuarios/login时,系统会自动转发到Users控制器的login方法,完全符合你的要求。
2. 批量匹配所有users控制器下的方法
要是你希望users控制器的所有方法都能通过usuarios前缀访问(比如/usuarios/profile对应/users/profile,/usuarios/edit/1对应/users/edit/1),可以用通配符路由来批量处理:
$route['usuarios/(:any)'] = 'users/$1';
这里的(:any)会匹配除斜杠外的任意字符,足以覆盖大部分单级方法的场景。如果需要支持多级路径(比如/usuarios/profile/edit/1),可以改用正则匹配路由:
$route['usuarios/(.+)'] = 'users/$1';
⚠️ 注意:路由规则是从上到下匹配的,所以具体的单条路由要放在通配符/正则路由的前面,否则会被批量规则优先匹配,导致特定路径的自定义规则失效。
方法二:搭配服务器重写隐藏index.php(可选)
如果你还想把URL里的index.php去掉,让地址更简洁(变成http://localhost/myapp/usuarios/login),还需要配置服务器的重写规则:
Apache服务器(用.htaccess)
在项目根目录创建.htaccess文件,写入以下内容:
RewriteEngine On # 排除实际存在的文件和目录,避免重写静态资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把所有请求转发到index.php处理 RewriteRule ^(.*)$ index.php/$1 [L]
然后修改application/config/config.php里的配置项:
$config['index_page'] = '';
Nginx服务器
在你的Nginx站点配置中添加这段规则:
location /myapp { try_files $uri $uri/ /myapp/index.php?$query_string; }
同样要把config.php里的$config['index_page']设为空字符串。
额外注意事项
- 确保你的控制器文件命名符合CodeIgniter规范:
Users.php(首字母大写),控制器类名也是Users,login方法存在且可访问。 - 测试前记得清空浏览器缓存,避免旧的URL缓存影响测试结果。
内容的提问来源于stack exchange,提问作者Kichu

