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

