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

CodeIgniter多段URI路由失效求助:4段URI返回404错误

CodeIgniter 4段URI路由失效及404问题解决

核心问题排查

导致4段URI路由失效并返回404的原因有三个:

  • 路由优先级顺序错误
  • 控制器方法参数与路由传递不匹配,且手动获取URI段存在逻辑错误
  • 模型方法参数接收不完整,查询条件缺失

分步修正方案

1. 调整路由顺序

CodeIgniter的路由匹配是从上到下依次匹配,更具体的路由规则必须放在通用规则前面。原路由中3段的规则会先匹配4段URL,导致4段路由永远无法触发。

修正后的路由:

$route['written-qb/(:num)'] = 'written-qb';  // 正常工作
$route['written-qb/(:any)/(:any)/(:any)'] = 'written-qb/written_qb_answer/$1/$2/$3';  // 移到3段路由之前
$route['written-qb/(:any)/(:any)'] = 'written-qb/written_qb_details/$1/$2';  // 正常工作

2. 修复控制器方法逻辑

移除手动获取URI段的冗余代码,直接使用路由传递的参数,同时保证参数数量与路由规则匹配:

修正written_qb_answer方法

public function written_qb_answer($category, $exam_slug, $question_slug){
    // 直接使用路由传递的参数,无需手动获取uri->segment
    $data['qb_info'] = $this->Question_bank_model->get_qb_answer_details($exam_slug, $question_slug);
    
    if(empty($data['qb_info'])){
        show_404();
    }

    $data['url_slug'] = $data['qb_info']['qb_exam_question_slug'];
    $data['meta_title'] = $data['qb_info']['qb_exam_question'];
    $data['meta_description'] = $data['qb_info']['qb_exam_answer_meta'];
    $data['meta_keywords'] = $data['qb_info']['qb_exam_answer_tags'];
    $data['main_content'] = 'answer';
    $this->load->view('include/template',$data);
}

优化written_qb_details方法(移除冗余代码)

public function written_qb_details($category, $slug = NULL){
    $data['qb_list'] = $this->Question_bank_model->get_qb_with_category(FALSE);
    // 直接使用路由传递的$slug参数,无需手动获取uri->segment(3)
    $data['qb_info'] = $this->Question_bank_model->get_qb_details($slug);
    
    if(empty($data['qb_info'])){
        show_404();
    }

    $data['url_slug'] = $data['qb_info']['qb_exam_slug'];
    $data['meta_title'] = $data['qb_info']['qb_exam'];
    $data['meta_description'] = $data['qb_info']['qb_exam_post_meta'];
    $data['meta_keywords'] = $data['qb_info']['qb_exam_post_tags'];
    $data['main_content'] = 'written_qb_details';
    $this->load->view('include/template',$data);
}

3. 修复模型方法参数接收

原模型get_qb_answer_details只接收一个参数,但控制器传递了两个参数,导致查询条件缺失,返回空结果触发404。调整模型方法以接收完整参数,并完善查询条件:

public function get_qb_answer_details($exam_slug = FALSE, $question_slug = FALSE){
    if($question_slug === FALSE){
        $this->db->where('qb_exam_answer_active',1);
        $query = $this->db->get('qb_exam_ans');
        return $query->result_array();
    }

    // 根据表结构完善查询条件,同时匹配考试slug和题目slug(如果需要)
    $query = $this->db->get_where('qb_exam_ans', array(
        'qb_exam_slug' => $exam_slug, // 假设表中存在该字段,根据实际表结构调整
        'qb_exam_question_slug' => $question_slug
    ));
    return $query->row_array();
}

内容的提问来源于stack exchange,提问作者Maruf Sheikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:37:20