codeigniter部署失败90%源于base_url、index_page、重写规则、php扩展未对齐;访问首页404或跳转index.php本质是重写未生效或配置不匹配,需确认apache的allowoverride all、nginx的try_files、index_page为空、base_url手动设完整url、php扩展齐全且vendor本地安装。

直接说结论:CodeIgniter 部署失败,90% 是因为 base_url、index_page、重写规则、PHP 扩展这四点没对齐,而不是框架本身有问题。
为什么访问首页显示 404 或跳转到 index.php?
这是最常见现象,本质是 URL 重写未生效或配置未匹配。关键不是“有没有 .htaccess”,而是 Apache/Nginx 是否真正允许并执行了重写逻辑。
- Apache 下必须确认:
a2enmod rewrite已运行(Debian/Ubuntu),且虚拟主机配置中包含<directory> AllowOverride All </directory>—— 仅改.htaccess但AllowOverride是None,完全无效 - Nginx 下不能复用 .htaccess 思路,必须在
server块里写明:try_files $uri $uri/ /index.php?$query_string; -
$config['index_page']必须设为空字符串:$config['index_page'] = '';,否则即使重写生效,CI 仍会主动拼上index.php - 检查
FCPATH定义是否指向真实物理路径(尤其部署在子目录时),它影响日志、缓存等底层路径拼接
base_url 为什么总是生成双斜杠或漏路径?
base_url() 返回异常,根本原因是 CI 没法自动推断出正确上下文 —— 它不猜,只拼。依赖自动检测在生产环境必然翻车。
-
$config['base_url']必须手动写死为完整 URL,例如:$config['base_url'] = 'https://example.com/';(根目录)或$config['base_url'] = 'https://example.com/myapp/';(子目录) - 不要用
http://$_SERVER['HTTP_HOST']动态拼,HTTPS 被反代时$_SERVER['HTTPS']可能为空,导致混合内容或协议错误 - 如果用了 CDN 或负载均衡,确保
X-Forwarded-Proto被信任,否则is_https()判断失效,影响重定向和资源链接
PHP 版本和扩展缺失导致白屏或报错
CI 3.x 和 CI 4.x 对 PHP 和扩展的要求差异大,混用会直接中断启动流程。
- CI 3.x:最低 PHP 5.6,但必须有
mbstring(缺则白屏)、curl(缺则 HTTP 客户端失效)、openssl(缺则 HTTPS 请求/加密函数崩) - CI 4.x:强制 PHP 8.1+,还额外需要
intl扩展(缺则日期/本地化功能异常),json必须启用(默认开启,但某些精简版系统会关) - 验证命令别只跑
php -v:php -m | grep -E 'mbstring|curl|openssl|intl|json'才算真正检查到位 - CI 4 的
vendor/目录必须在目标服务器上运行composer install,不能直接上传开发机的vendor—— autoloader 路径硬编码了绝对路径
生产环境必须关闭调试但容易被忽略的点
光改 ENVIRONMENT 不够,很多配置项是条件加载的,比如数据库调试开关、日志级别、缓存策略,它们都依赖环境变量的准确传递。
- 推荐用服务器级方式设置环境变量,比如 Apache 的
SetEnv CI_ENV production,比直接改index.php更安全可控 - 确认
app/Config/Logger.php(CI4)或application/config/config.php中的log_threshold在生产环境设为0,避免日志文件暴增 - CI 4 的
.env文件必须设权限为640或更严,且不能被 Web 直接访问(Nginx/Apache 需屏蔽/.env路径) - REST API 场景下,
rest_enable_keys和force_https这类配置若没在src/rest.php里显式打开,API 就等于裸奔
最易被绕开的其实是路径一致性:从 FCPATH 到 base_url,再到 Nginx 的 root 指令、Apache 的 DocumentRoot,所有环节的物理路径和 URL 路径必须严格对应。差一个子目录层级,就可能让静态资源 404、日志写入失败、甚至路由解析错乱。











