You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:41:49