CI4 与 CI3 的 .htaccess 完全不同,因 CI4 采用 PSR-7 和独立 public/ 入口目录,.htaccess 必须置于 public/ 下、目标为 index.php/$1、不可加开头斜杠,且需同步修改 App.php 中 $indexPage = '',否则生成链接仍含 index.php。

CI 4.7.2 默认不依赖 .htaccess 去掉 index.php,但 Apache 下仍需它配合;直接改 $config['index_page'] = '' 不够,.htaccess 写错会导致 500 或 404,且 CI4 的重写逻辑和 CI3 有本质区别。
为什么 CI4 的 .htaccess 和 CI3 完全不同
CI4 使用 PSR-7 请求对象和独立的 public/ 入口目录,所有 Web 请求必须指向 public/ 目录(不是项目根目录)。这意味着:.htaccess 必须放在 public/ 目录下,而非项目根目录;重写目标是 index.php 本身,不是 /index.php/$1 这类 CI3 风格路径;RewriteBase 必须设为 /(除非你用子目录部署且没配虚拟主机)。
Apache 必须开启并允许 rewrite 模块
不满足这两点,.htaccess 文件会被完全忽略:
- 确认
mod_rewrite已启用:LoadModule rewrite_module modules/mod_rewrite.so行前的#已去掉 - 找到对应
public/目录的<directory></directory>块(不是项目根目录!),把AllowOverride None改成AllowOverride All - 如果用虚拟主机,确保
<directory></directory>包含AllowOverride All和Require all granted
public/ 目录下的 .htaccess 正确写法
内容必须严格匹配 CI4 官方推荐(CI4.7.2 无变更):
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
立即学习“PHP免费学习笔记(深入)”;
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
注意几个关键点:
- 不要加
RewriteBase—— 除非你部署在子目录(如http://localhost/myapp/),此时才加RewriteBase /myapp/ - 第二、三行用
%{REQUEST_FILENAME}判断真实文件/目录是否存在,这是 CI4 路由前置条件 - 最后一行目标是
index.php/$1,不是/index.php?/$1或/index.php/$1(开头多斜杠会 404) - 别照搬 CI3 的
!^(index\.php|assets|...)写法 —— CI4 的静态资源本就放在public/下,直接可访问,无需过滤
CI4 配置文件里只改一处,且必须改
打开 app/Config/App.php(不是 application/config/config.php,那是 CI3 的路径):
- 找到
public $indexPage = 'index.php'; - 改为
public $indexPage = ''; - 这个值控制框架生成 URL 时是否拼
index.php,不改的话即使重写生效,site_url()仍输出带index.php的链接
漏掉这步,浏览器地址栏看着没 index.php,但页面里的链接、表单 action、AJAX 地址全都会带回来 —— 这是最容易被忽略的“半成功”状态。


















