必须同步修改三处:.htaccess规则(ci3用index.php?/$1、ci4用index.php/$1)、config.php中$config['index_page'] = ''及关联配置(如uri_protocol、base_url)、apache的allowoverride all与mod_rewrite启用;任一缺失均导致除首页外全部404。

能去掉,但必须三处同步改对,缺一不可:.htaccess 规则、config.php 中的 $config['index_page']、Apache 的 AllowOverride 配置。任一环节出错,都会表现为首页正常、其他路由 404。
Apache 下 .htaccess 规则怎么写才不踩坑
CI3 和 CI4 的重写目标不同,规则不能混用。CI3 默认走 QUERY_STRING 模式(index.php?/xxx),CI4 默认走 PATH_INFO 模式(index.php/xxx)。写错会导致控制器无法识别路由参数。
- CI3 推荐规则(含问号):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] - CI4 必须用无问号版本(否则
$_SERVER['PATH_INFO']为空):RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] - 别漏掉
<ifmodule mod_rewrite.c></ifmodule>包裹——它不会报错,但模块未启用时整段规则被跳过,你根本意识不到问题出在这儿 - CI4 项目根目录下没有
.htaccess,要检查public/.htaccess(因为 CI4 入口在public/目录)
config.php 里只改 $config['index_page'] 不够
光设成空字符串还不够,$config['uri_protocol'] 和 $config['base_url'] 必须配合调整,否则本地开发或子目录部署时 URL 生成错乱。
-
$config['index_page'] = '';—— 这是前提,但不是全部 -
$config['uri_protocol']建议保持'AUTO';若强制设为'PATH_INFO',需确认服务器确实支持且未被 PHP-FPM 截断(常见于 Nginx + PHP-FPM 组合) -
$config['base_url']应显式填写完整域名路径,例如'https://example.com/myapp/',避免依赖$_SERVER动态推导出错 - CI4 不再读取该配置中的
base_url,改由public/index.php或环境变量APP_URL控制,这点容易误沿用 CI3 习惯
Apache 配置里最容易被忽略的两个开关
即使 .htaccess 写对了,Apache 默认也不会理它。90% 的“首页能打开、点链接就 404”问题都卡在这两步。
-
LoadModule rewrite_module modules/mod_rewrite.so必须在httpd.conf中取消注释;Ubuntu/Debian 用户可直接运行a2enmod rewrite -
AllowOverride All必须出现在对应目录的<directory></directory>块中,不能只写AllowOverride FileInfo—— 后者不放行RewriteEngine - CI4 要求
DocumentRoot指向public/目录,而不是项目根目录;如果指错了,.htaccess根本没机会执行 - 改完 Apache 配置后必须重载服务:
sudo systemctl reload apache2(Linux)或sudo apachectl graceful(macOS),重启不等于重载
真正麻烦的不是写哪几行代码,而是 Apache 是否真把请求交给了 index.php。建议先在 .htaccess 末尾加一行 Redirect 302 /test-rewrite /,访问 /test-rewrite 看是否跳转——不跳,说明重写根本没生效,不用往下查 PHP 配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











