CI4访问自定义控制器方法遇404路由找不到问题求助
解决CI4路由404及请求跳转异常问题
问题场景
- 通过Composer将CI4安装到rapti目录,访问
http://localhost/rapti/public/正常 - 在默认Home控制器新增test方法,访问
http://localhost/rapti/public/home/test报404错误:Can't find a route for 'get: home/test' - 创建新Youtube控制器访问时同样报404
- 将
app/Config/App.php中$uriProtocol改为QUERY_STRING后无报错,但所有请求均跳转到Home控制器的index方法
解决步骤
1. 确认自动路由配置
CI4默认支持自动路由,需确保路由配置未手动关闭:
打开app/Config/Routes.php,检查是否开启自动路由:
$routes->setAutoRoute(true);
如果手动关闭了自动路由(设为false),则需要手动添加对应路由,比如:
$routes->get('home/test', 'Home::test'); $routes->get('youtube', 'Youtube::index');
2. 遵循控制器命名规范
CI4对控制器命名有严格要求:
- 控制器文件名必须首字母大写,如
Home.php、Youtube.php - 控制器类名需与文件名完全一致,且首字母大写,示例:
class Home extends BaseController { public function test() { return 'Test Method Content'; } } - 方法名支持小写或驼峰,URL中统一用小写访问(如
home/test对应控制器内的test()方法)
3. 恢复uriProtocol默认值
将app/Config/App.php中的$uriProtocol改回默认的REQUEST_URI:
public string $uriProtocol = 'REQUEST_URI';
改为QUERY_STRING会导致CI4无法正确解析URL路径,进而所有请求匹配默认路由。
4. 检查服务器重写规则
若以上配置正确仍报404,需确认服务器重写规则是否生效:
- Apache环境:确保
public/.htaccess文件存在,内容如下:
同时确认Apache已开启RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]mod_rewrite模块。 - Nginx环境:在站点配置中添加重写规则:
location / { try_files $uri $uri/ /index.php$is_args$args; }
5. 清除路由缓存
CI4会缓存路由配置,修改配置后可通过以下方式清除:
- 删除
writable/cache目录下的所有文件 - 访问任意CI4页面时添加
?cache_clear=1参数,如http://localhost/rapti/public/?cache_clear=1
内容的提问来源于stack exchange,提问作者Anurag
相关产品推荐
相关产品推荐

