You need to enable JavaScript to run this app. CI项目点击邮件内验证链接返回404 存在的控制器方法无法调用
优惠活动
大模型
产品
解决方案
定价
更多

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方法存在三处会影响正常运行的问题:
    1. CI框架默认会自动将URL中方法名后的参数段直接传递给方法形参,不需要再手动调用$this->uri->segment(3)重复取值;方法定义时将$reg_key设为必填参数,当URL缺失该参数时,PHP会直接抛出参数缺失的致命错误,无法触发代码里写的未获取参数就跳转登录页的分支。
    2. 方法内拼接的登录链接存在语法错误:PHP代码被写在单引号包裹的纯字符串内部,这部分代码不会被服务器解析,只会作为纯文本输出到页面,就算能正常访问方法,跳转链接也是无效的。
    3. 代码中缺失视图加载逻辑,就算业务判断走完也无法渲染对应提示内容。
      修正后的方法参考:
    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);
    }
    
  • .htaccess配置错误
    当前.htaccess存在两处配置问题:
    1. 重写条件的变量名存在语法笔误:将%{REQUEST_FILENAME}错写为%(REQUEST_FILENAME),错误的变量格式会导致Apache忽略该判断条件,引发路径映射异常。
    2. 由于项目部署在/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 13:06:04