CI项目点击邮件内验证链接返回404 存在的控制器方法无法调用
404报错问题定位与修复
- 路由配置匹配失效
当前配置的$route['users/confirm_email'] = 'users/confirm_email'仅能精确匹配不带后缀参数的users/confirm_email路径,无法识别携带reg_key参数的多级访问路径,是触发404的核心原因。需要将路由规则修改为支持任意参数捕获的格式:$route['users/confirm_email/(:any)'] = 'users/confirm_email/$1';
路由配置不需要额外添加/quest子目录前缀,CI会自动根据配置文件中设定的base_url识别项目所在路径。 - 控制器方法逻辑缺陷
当前confirm_email方法存在三处会影响正常运行的问题:- CI框架默认会自动将URL中方法名后的参数段直接传递给方法形参,不需要再手动调用
$this->uri->segment(3)重复取值;方法定义时将$reg_key设为必填参数,当URL缺失该参数时,PHP会直接抛出参数缺失的致命错误,无法触发代码里写的未获取参数就跳转登录页的分支。 - 方法内拼接的登录链接存在语法错误:PHP代码被写在单引号包裹的纯字符串内部,这部分代码不会被服务器解析,只会作为纯文本输出到页面,就算能正常访问方法,跳转链接也是无效的。
- 代码中缺失视图加载逻辑,就算业务判断走完也无法渲染对应提示内容。
修正后的方法参考:
public function confirm_email($reg_key = null) { if(!$reg_key) { redirect('users/login'); } if($this->user_model->verify_email_key($reg_key)) { $login_url = base_url('users/login'); $data['message'] = '<h1 align="center">Your Email has been successfully verified, now you can <a href="'.$login_url.'">login</a></h1>'; } else { $data['message'] = '<h1 align="center">Invalid Link</h1>'; } // 加载对应提示页视图 $this->load->view('common/message', $data); } - CI框架默认会自动将URL中方法名后的参数段直接传递给方法形参,不需要再手动调用
- .htaccess配置错误
当前.htaccess存在两处配置问题:- 重写条件的变量名存在语法笔误:将
%{REQUEST_FILENAME}错写为%(REQUEST_FILENAME),错误的变量格式会导致Apache忽略该判断条件,引发路径映射异常。 - 由于项目部署在
/quest子目录下,.htaccess文件必须和网站入口文件index.php放在同一层级(即/quest文件夹内),不能放在更高层级的网站根目录。
修正后的.htaccess参考:
RewriteEngine On # 声明项目所在的子目录路径 RewriteBase /quest/ RewriteCond $1 !^(index\.php|assets|images|js|css|uploads|favicon.png) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L] - 重写条件的变量名存在语法笔误:将
- 快速排查验证方法
可以临时访问带index.php入口的链接测试,比如https://mr_marvel.com/quest/index.php/users/confirm_email/测试验证key:- 如果该链接可正常访问,说明问题出在URL重写规则配置上
- 如果该链接依然报404,需要检查控制器的存放路径、类名拼写,确保控制器文件位于
application/controllers/Users.php,类名拼写为Users且正确继承CI控制器基类,无大小写或拼写错误
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

