如何在CodeIgniter中移除控制器与方法名,实现城市名URL路径
嘿,这问题我熟!要把 URL 里的 location 方法名也去掉,直接用 www.example.com/城市名/ 访问,咱们分几步来搞定:
1. 调整路由规则(application/config/routes.php)
首先,你已经移除了控制器名,现在要把方法名也去掉,就得修改路由匹配逻辑。不过要注意路由优先级——CodeIgniter 是按从上到下的顺序匹配路由的,所以要把城市名的路由放在其他明确的路由(比如首页、关于页等)之后,避免把正常页面当成城市名解析。
举个例子:
// 默认控制器,处理初始选择省份城市的页面 $route['default_controller'] = 'site'; // 如果有其他固定页面的路由,先写在这里(比如关于页、联系页) $route['about'] = 'site/about'; $route['contact'] = 'site/contact'; // 最后写城市名的路由规则,把任意分段匹配到 site/location 方法,并传递城市名参数 $route['(:any)'] = 'site/location/$1';
如果你的城市名都是中文,还可以用正则匹配更精准,避免和英文页面冲突:
// 只匹配中文城市名(适配大部分国内城市名称) $route['([\x{4e00}-\x{9fa5}]+)'] = 'site/location/$1';
2. 更新重定向逻辑
之前你是重定向到 location/城市名,现在要改成直接重定向到根目录下的城市名路径:
// 原来的代码 // redirect('location/' . $city_name); // 修改后的代码 redirect('/' . $city_name . '/');
3. 调整控制器方法的参数获取
在 Site 控制器的 location 方法里,原来你可能是通过 $this->uri->segment(2) 获取城市名,现在 URL 里的第一个分段就是城市名了,所以要改成:
public function location($city = null) { // 先判断有没有传入城市参数,没有的话跳回初始选择页面 if (!$city) { redirect('/'); } // 后续处理城市相关的逻辑,比如加载对应城市的目录内容 // ... }
或者用 URI 类获取:
$city = $this->uri->segment(1);
注意事项
- 要确保你的城市名称不会和现有页面的 URL 重名(比如如果有个城市叫「about」,就会和你的关于页冲突),如果有这种情况,要么调整路由顺序,要么给城市名加个隐性前缀(不过这违背你的需求,所以尽量避免重名)。
- 记得测试各种场景:初始页面加载、选择城市后的重定向、直接访问城市 URL、访问其他固定页面,确保都能正常工作。
内容的提问来源于stack exchange,提问作者Shubh
相关产品推荐
相关产品推荐

