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
相关产品推荐
相关产品推荐

