CodeIgniter3如何通过htaccess配置实现店铺名替换ID的URL访问
核心方案说明
通过htaccess无法直接实现该需求,因为店铺名称与店铺ID的映射关系存储在数据库中,htaccess无法动态读取数据库内容做路径匹配,正确方式是基于CodeIgniter 3自带的路由规则+业务逻辑调整实现。
步骤1:修正现有基础配置错误
首先修复现有配置的明显问题:
修正后的.htaccess文件
把HTTP跳转规则放到最前面,避免静态规则被CI入口规则拦截:
RewriteEngine On # HTTP转HTTPS规则放最前 RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://coffee.com/shop/$1 [R=301,L] # CI默认入口重写规则 RewriteCond $1 !^(index\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,QSA]
修正config.php的语法错误
原base_url漏了末尾的单引号:
$config['base_url'] = 'https://coffee.com/shop/';
步骤2:新增数据库查询方法
在application/models/User_model.php中新增根据店铺名称查询卖家信息的方法,提前确认seller表中店铺名称字段已经加了唯一索引,避免重复数据:
// 按店铺唯一名称查询卖家信息 public function get_seller_by_shop_name($shop_name) { return $this->db->get_where('seller', ['shop_name' => $shop_name])->row_array(); }
步骤3:调整控制器逻辑
修改原shops方法,接收参数从卖家ID改为店铺名称:
public function shops($shop_name = '') { // 按店铺名查询卖家信息 $seller = $this->user_model->get_seller_by_shop_name($shop_name); if(empty($seller)) { // 店铺不存在跳404 show_404(); } $seller_id = $seller['id']; $this->data['pList'] = $this->product_model->get_productType(null,$seller_id,null,null); $this->data['seller'] = $seller; $this->template->load('layouts/main', 'pages/shop_paging',$this->data); }
步骤4:配置自定义路由
编辑application/config/routes.php,添加路由规则匹配店铺名称路径:
// 店铺自定义URL规则,优先级放于其他通用规则之后,避免覆盖正常业务路径 $route['([a-zA-Z0-9_-]+)'] = 'page/shops/$1';
如果需要限制店铺名称的字符范围,可以调整正则匹配规则,比如只允许小写字母+数字,改成$route['([a-z0-9]+)'] = 'page/shops/$1';
步骤5:旧URL兼容跳转(可选但推荐)
为了避免原有带ID的URL失效、丢失SEO权重,可以在控制器中新增旧路径跳转逻辑:访问原路径/page/shops/[id]时,查询对应的店铺名称,301跳转到新的/[店铺名]路径即可。
内容的提问来源于stack exchange,提问作者azri
相关产品推荐
相关产品推荐

