共享主机通常不支持ci4.3.5,必须同时满足三点硬限制:php ≥ 8.1、mbstring与curl扩展已启用、允许执行php spark或至少能手动运行public/index.php;否则将因语法错误、扩展缺失或函数禁用而无法启动。

共享主机上能跑CI4.3.5吗?先看这三点硬限制
绝大多数共享主机(如GoDaddy、Bluehost、SiteGround)默认不支持CI4.3.5,不是“配置不对”,而是底层环境直接卡死——必须同时满足:PHP ≥ 8.1、mbstring 和 curl 扩展已启用、允许执行 php spark 或至少能手动运行 public/index.php。很多主机只提供 PHP 7.4 或 8.0,且禁用 exec() 和 shell_exec(),导致 spark 命令完全失效。
- 登录主机控制面板(cPanel / Plesk),查 PHP 版本:若显示
8.0.x或更低,CI4.3.5 无法启动,会报ParseError: syntax error, unexpected token "string" - 在
phpinfo()页面搜索mbstring和curl:两者必须为enabled,缺一不可;某些主机需在“PHP 软件包”里手动勾选启用 - 尝试通过 FTP 上传一个测试脚本
test-spark.php:<?php echo shell_exec('php --version 2>&1'); ?>若输出为空或报Disabled functions: shell_exec,说明spark不可用,只能走纯 Web 入口方案
不用 spark,怎么把 CI4.3.5 丢上去就跑
共享主机通常只开放 public_html/ 或 www/ 目录的写权限,不能改 Apache 的 DocumentRoot。所以必须把整个 CI4 项目挪进 public/ 目录层级,让 public_html/ 指向 myapp/public/ —— 这是唯一可行路径,否则必然 404。
- 本地完成项目:用
composer create-project codeigniter4/appstarter myapp初始化,确保.env已重命名为真实文件,并设CI_ENVIRONMENT = development - 把
myapp/public/下所有内容(含index.php、css/、js/)整体复制到主机的public_html/myapp/目录下(注意:不是把整个myapp/文件夹放进去) - 把
myapp/app/、myapp/writable/、myapp/env等其余目录,全部移到public_html/myapp/同级的../myapp-private/(或任意上级不可 Web 访问目录),然后修改public_html/myapp/index.php中的路径:define('APPPATH', '../myapp-private/app/');和$pathsConfig = '../myapp-private/app/Config/Paths.php';
-
baseURL必须设为完整 URL:app.baseURL = 'https://yourdomain.com/myapp/'(结尾带斜杠),否则 CSS/JS 404
.env 配置在共享主机上特别容易漏掉的三件事
共享主机常禁用 file_get_contents('.env') 或因 SELinux / open_basedir 限制读不到根目录下的 .env。CI4.3.5 会静默 fallback 到默认配置,结果数据库连不上、错误不报、日志不写——你看到的白屏,大概率是 .env 根本没生效。
- 确认
.env文件确实在项目根目录(即和public/同级的myapp-private/目录下),而不是放在public/里 - 检查文件权限:设为
644(不是777),某些主机对777会拒绝读取以“增强安全” - 如果仍不生效,在
public/index.php开头手动加载:if (file_exists(__DIR__.'/../.env')) { $dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..'); $dotenv->load(); }(需确认vendor/autoload.php已正确引入vlucas/phpdotenv)
路由 404?别怪框架,先查主机的 rewrite 是否真开启
共享主机的 .htaccess 支持是“半残废”状态:可能允许 RewriteEngine On,但屏蔽 RewriteCond %{REQUEST_FILENAME} 或拒绝 -f/-d 检测。直接导致所有非 / 路由返回 404,且错误页面还是 CI4 自己的——你以为是路由没配,其实是 Apache 根本没转发请求给 index.php。
- 把
public/.htaccess内容简化成最简版(删掉所有注释和冗余规则):RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php/$1 [L] - 如果仍 404,换用无 rewrite 方案:在
app/Config/App.php中设public $indexPage = 'index.php';,然后所有 URL 显式带index.php,比如https://yoursite.com/myapp/index.php/home - 某些主机(如老版本 cPanel)要求
.htaccess必须放在public_html/根目录,而非子目录——这时要把.htaccess移到public_html/.htaccess,并改写规则指向子目录:RewriteBase /myapp/
共享主机部署 CI4.3.5 的本质,是绕过框架默认假设,把“Web 根目录必须是 public/”这个前提强行嫁接到受限环境中。每一步都要验证实际效果,而不是依赖文档描述——因为主机厂商的“PHP 设置”开关背后,往往藏着未公开的扩展禁用列表和 open_basedir 白名单。











