public/ 必须为 web 根目录,baseurl 需与实际访问协议域名完全一致,静态资源须用 base_url() 生成路径,重写规则需确保静态文件直出,生产环境严格按配置输出。

public/ 目录必须是 Web 根目录,否则 baseURL 会失效
静态资源(CSS、JS、图片)路径错乱,90% 源于 Web 服务器实际根目录没指向 public/。CodeIgniter 4 的所有前端请求都必须经由 public/index.php 入口,app/ 和 writable/ 等目录绝不能被 Web 直接访问。
常见错误配置:
- XAMPP 中
httpd.conf的DocumentRoot指向htdocs/myapp/(错)→ 应改为htdocs/myapp/public/ - Nginx 配置里
root设为/var/www/myapp/(错)→ 必须是/var/www/myapp/public/ - Docker 或云主机上用
php -S启动时未指定public/为文档根:正确命令是php -S localhost:8000 -t public/ public/index.php
App::$baseURL 必须与真实访问协议+域名完全一致
baseURL 不只是用来拼接静态资源 URL,它还影响 CSRF token、重定向、资产链接生成等行为。若填错,浏览器会加载 http://localhost/css/app.css 而不是 http://localhost/myapp/public/css/app.css,直接 404。
检查 app/Config/App.php 中的配置:
- 本地开发:
public $baseURL = 'http://localhost/';(无子路径) - 部署在子目录如
https://example.com/myapp/:public $baseURL = 'https://example.com/myapp/';(结尾必须有斜杠) - 绝对禁止写成
'http://localhost/myapp/public/'—— 这会导致重复public段,资源路径变成.../public/public/css/... - HTTPS 环境下务必用
https://,否则混合内容警告或资源被拦截
模板中必须用 base_url() 或 site_url() 生成路径
硬编码 /css/app.css 或 ./assets/js/main.js 在跨平台部署时必然出错——路径解析依赖当前路由上下文,而不同服务器对相对路径的处理不一致。
正确做法:
- CSS/JS/图片等静态资源统一用
base_url('css/app.css')→ 输出完整 URL,如https://example.com/css/app.css - 控制器链接用
site_url('home/index')→ 基于路由生成,自动适配index.php模式或重写模式 - 不要在 CSS 中用
url(../images/logo.png)引用图片——改用url(/images/logo.png)并确保该路径由base_url()控制 - 如果用了 Vite 或 Webpack 构建,输出的
manifest.json中路径也需以base_url()为前缀拼接
.htaccess 或 Nginx 重写规则未生效,导致 index.php 残留干扰路径解析
当 URL 中仍带 index.php(如 http://localhost/index.php/css/app.css),说明重写失败。此时 base_url() 生成的路径虽正确,但 Web 服务器找不到对应文件,因为请求被错误地转发给了 PHP 路由器而非直接返回静态文件。
排查要点:
- 确认
public/.htaccess文件存在且未被覆盖(CI4 官方版本自带,勿删) - Apache 下检查
httpd.conf或虚拟主机配置中是否启用AllowOverride All(仅None时 .htaccess 失效) - Nginx 用户必须显式配置静态资源直出规则,例如:
location ~* \.(css|js|png|jpg|gif|ico)$ { try_files $uri =404; } - Cloudflare 或 CDN 后端,注意是否缓存了旧的 404 响应,清缓存再试
最易被忽略的一点:环境变量 CI_ENVIRONMENT 设为 production 后,base_url() 不再自动 fallback 到 http://localhost/,它会严格按 App::$baseURL 输出——哪怕你只改了域名没同步更新配置,静态资源就全挂了。











