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

CodeIgniter 4如何访问Controllers/api子文件夹中的控制器方法?

问题:CodeIgniter 4 子目录控制器访问返回404错误

环境信息

  • 框架版本:CodeIgniter 4
  • 服务器系统:Rocky Linux release 8.7(兼容RHEL/CentOS/Fedora)
  • Web服务:Apache
  • PHP版本:8.1

问题现象

项目其余功能正常,但调用Controllers/api子目录中的控制器时全部失效。访问URL https://test.myweb.com/api/usr(对应文件路径/home/test/public_html/app/Controllers/api/Usr.php),返回404 - File Not Found. HTTP.controllerNotFound错误,调用该控制器任意方法均触发此问题。

已尝试的路由配置

$route['api/(:any)'] = 'api\$1';
$routes->resource('App\Controllers\api');
$route['api/usr'] = 'https://test.myweb.com/api/Usr';
$route['api/([^/]+)'] = 'api/usr/$1';

$routes->get('api/usr', '\App\Controllers\api\Usr');

Usr.php控制器代码

<?php
namespace App\Controllers\Api;
use CodeIgniter\Controller;

class Usr extends Controller {

    public function index(){
        echo "OK INDEX";die;
    }
}

当前.htaccess配置

RewriteEngine On
#Deny Access
RewriteRule "^(.*/)?\.gitignore" - [F,L]
RewriteRule "^(.*/)?\_sql/" - [F,L]
RewriteRule "^(.*/)?doc-project/" - [F,L]
RewriteRule "^(.*/)?\.git/" - [F,L]
RewriteRule "^(.*/)?README.md" - [F,L]

#Force HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_ADDR} !=127.0.0.1
RewriteCond %{SERVER_ADDR} !=::1
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^(.*)$ index.php?/ [L]
RewriteCond $1 !^(index\.php|images|php|script|styles|js|css)

<IfModule mod_rewrite.c>
    RewriteBase /        
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

解决思路

1. 修正路由配置

CodeIgniter 4使用$routes对象而非CI3的$route数组,混用两种语法会导致路由失效,正确写法:

  • 单个控制器路由:
    $routes->get('api/usr', '\App\Controllers\Api\Usr::index');
    
  • 批量分组路由(方便管理多个API控制器):
    $routes->group('api', static function ($routes) {
        $routes->get('usr', '\App\Controllers\Api\Usr::index');
        // 可添加其他API控制器的路由规则
    });
    

若想使用自动路由,需确保app/Config/Routing.php中$autoRoutesImproved设为true,且$controllerNamespace为App\Controllers,但生产环境建议关闭自动路由以保证安全。

2. 统一命名空间与目录大小写

Linux系统区分大小写,控制器命名空间为App\Controllers\Api(首字母大写),但目录是app/Controllers/api/(小写),需二者保持一致:

  • 要么将目录重命名为app/Controllers/Api/;
  • 要么修改控制器命名空间为App\Controllers\api。

3. 修复.htaccess规则冲突

当前配置存在规则优先级问题,RewriteRule ^(.*)$ index.php?/ [L]会提前拦截所有请求,导致后续转发规则失效,替换为如下配置:

RewriteEngine On
# 禁止访问敏感文件/目录
RewriteRule "^(.*/)?\.gitignore" - [F,L]
RewriteRule "^(.*/)?\_sql/" - [F,L]
RewriteRule "^(.*/)?doc-project/" - [F,L]
RewriteRule "^(.*/)?\.git/" - [F,L]
RewriteRule "^(.*/)?README.md" - [F,L]

# 强制HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_ADDR} !=127.0.0.1
RewriteCond %{SERVER_ADDR} !=::1
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# 转发请求到index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

4. 检查Apache配置

  • 验证mod_rewrite模块是否启用:执行httpd -M | grep rewrite,若输出rewrite_module (shared)则正常;
  • 确保网站根目录的AllowOverride设为All,否则.htaccess规则不生效,在虚拟主机配置中添加:
    <Directory "/home/test/public_html">
        AllowOverride All
        Require all granted
    </Directory>
    
  • 重启Apache服务:systemctl restart httpd

5. 验证文件权限

确保Apache用户(通常为apache)能读取控制器文件:

chown apache:apache /home/test/public_html/app/Controllers/Api/Usr.php
chmod 644 /home/test/public_html/app/Controllers/Api/Usr.php

内容的提问来源于stack exchange,提问作者Telerín

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:40:23