CodeIgniter应用首次加载404,刷新后正常显示问题求助
听起来这个问题有点棘手——首次访问www.example.com/xyz/出404,刷新就正常,结合你的配置,我整理了几个最可能的排查方向,你可以一步步试:
1. 检查.htaccess重写规则
这是最常见的原因,尤其是在Linux服务器上。你的项目在xyz子目录里,.htaccess需要正确适配这个路径。
打开项目根目录(xyz文件夹)的.htaccess文件,确保规则是这样的:
RewriteEngine On RewriteBase /xyz/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
重点是RewriteBase /xyz/这一行,它告诉服务器重写的基准路径是你的项目子目录。如果之前没加这行,首次请求可能无法正确映射到CodeIgniter的入口文件,刷新后服务器缓存了路径规则才恢复正常。
2. 确认config.php中的base_url配置
打开application/config/config.php,找到$config['base_url'],确保它设置正确:
$config['base_url'] = 'http://www.example.com/xyz/';
如果这个值留空或设置错误,CodeIgniter首次加载时可能无法正确解析路由,导致404;刷新后可能因为自动检测到正确路径而恢复。
3. 调整服务器默认文件优先级
有些服务器会优先尝试加载目录默认文件(比如index.html、default.html),如果你的xyz文件夹里恰好有这类文件,首次请求时服务器会先找它们,找不到才会交给CodeIgniter的index.php,这可能引发首次404。
你可以:
- 删除
xyz文件夹下的index.html之类的默认文件 - 或者在服务器配置(比如Apache的
httpd.conf或虚拟主机配置)里,把index.php设为最高优先级的默认文件:
DirectoryIndex index.php index.html index.htm
4. 验证控制器的大小写和命名
Linux服务器区分大小写,你的路由设置的是Member控制器,那对应的文件必须是Member.php(首字母大写),控制器类名也必须是Member,继承CI_Controller:
class Member extends CI_Controller { public function index() { // 你的业务代码 } }
如果文件名是member.php(小写),首次请求可能因为服务器找不到正确类而返回404,刷新后CodeIgniter的自动加载缓存了类路径才正常。
5. 关闭路由缓存
如果你之前开启了路由缓存,可能导致首次加载时旧的缓存规则生效。打开application/config/config.php,确保:
$config['cache_routes'] = FALSE;
如果之前是TRUE,改成FALSE后清空application/cache目录下的缓存文件,再测试。
建议先从.htaccess和base_url这两个点开始排查,这是最容易出问题的地方。如果还是不行,再依次检查后面的方向。
内容的提问来源于stack exchange,提问作者Farhan Khan

