根本原因是apache/nginx将静态资源请求错误转发至index.php处理,而ci不托管静态文件;需在.htaccess中用rewritecond显式排除assets/css/js/images等路径,并确保rewritebase正确、mod_rewrite启用且allowoverride all生效。

CodeIgniter 3 启用 URL 重写后,css、js、images 等静态资源返回 404,根本原因不是重写规则写错了,而是 Apache(或 Nginx)把对这些文件的请求也交给了 index.php 处理——而 CI 并不负责托管静态文件,最终 404。
Apache 的 .htaccess 没排除静态文件路径
默认的重写规则(如官方推荐的)只检查“不是真实文件/目录”,但若你把静态资源放在 assets/ 或 public/ 下,而该目录本身存在,规则却没显式放行,就可能因条件顺序或权限问题被跳过。
- 确保
.htaccess中的RewriteCond明确排除常见静态后缀和目录:
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase / # 注意:若部署在子目录(如 /myapp/),这里必须设为 /myapp/
# 排除真实存在的静态文件和目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 额外加一行:直接放行 assets/、css/、js/、images/ 等路径(按你实际结构调整)
RewriteCond %{REQUEST_URI} !^/(assets|css|js|images|fonts|favicon\.ico) [NC]
RewriteRule ^(.*)$ index.php/$1 [L]
</ifmodule>
-
RewriteBase必须与实际部署路径一致;设错会导致所有重写路径偏移,连带静态资源路径也错位 -
[NC]表示忽略大小写,避免Images/被拦截 - 如果静态资源放在
application/views/assets/这类非 Web 可访问路径下,那根本不会被请求到——必须放在 Web 根目录可直访位置(如assets/)
CI 的 base_url() 输出不带尾斜杠导致拼接错误
前端 JS 中用 base_url() 拼接资源路径时,若它返回 http://example.com(无尾斜杠),再拼 "css/app.css" 就变成 http://example.comcss/app.css —— 显然 404。
- 检查
application/config/config.php中是否设置了:
$config['base_url'] = 'http://example.com/'; // ✅ 必须以 / 结尾
- JS 中不要依赖服务端变量拼接路径,优先用相对路径或 HTML
<base href="/"> - 若必须用 PHP 输出,在视图中写:
<link rel="stylesheet" href="<?=%20base_url('css/app.css')%20?>">——base_url()函数内部会自动处理斜杠拼接
服务器未启用 mod_rewrite 或 .htaccess 未生效
即使规则写对了,若 Apache 没开重写模块或目录不允许覆盖配置,规则根本不会执行,所有请求都走默认路由,静态资源反而能加载;但一旦开启重写却没配好,就全崩。
- 确认 Apache 已启用:
a2enmod rewrite(Ubuntu/Debian)或检查httpd.conf中LoadModule rewrite_module是否启用 - 确认虚拟主机配置中允许 .htaccess 覆盖:
AllowOverride All(不能是None) - 重启 Apache:
sudo systemctl restart apache2 - 临时在
.htaccess顶部加一行deny from all,访问任意资源看是否 403 —— 若没反应,说明 .htaccess 完全没生效
最易被忽略的是:本地开发用 PHP 内置服务器(php -S)根本不支持 .htaccess,此时重写规则完全无效,静态资源看似正常,一上 Apache 就全挂——务必在目标环境中验证。另外,CI3 对 URL 中的点号(.)默认过滤,若你把资源放在 dist/ 下且路径含 .min.js,需检查 $config['permitted_uri_chars'] 是否包含点号。











