CodeIgniter网站在线主机子页面404错误排查请求
这种情况我在部署CodeIgniter项目时碰到过好多次,大概率是服务器配置或者框架基础设置没匹配上,咱们一步步来排查解决:
1. 先确认服务器的mod_rewrite模块是否开启
很多共享主机默认没启用这个Apache模块,这会直接导致你的.htaccess规则失效。你可以通过在项目根目录新建一个info.php文件,内容写<?php phpinfo(); ?>,访问后搜索mod_rewrite看是否存在;或者直接联系主机客服确认。如果没开启,要么让主机方启用,要么先临时用带index.php的URL访问(比如http://142.93.173.123/index.php/你的控制器/方法),验证是不是这个问题。
2. 检查CodeIgniter核心配置文件
打开application/config/config.php,确认两个关键设置:
$config['base_url']必须填你在线主机的完整地址:$config['base_url'] = 'http://142.93.173.123/';(注意末尾的斜杠不能少)$config['index_page']要设为空字符串:$config['index_page'] = '';,因为我们要通过.htaccess去掉URL里的index.php
3. 调整.htaccess适配服务器环境
你的当前.htaccess规则在某些主机环境下可能不生效,试试这些常用的变体:
Apache环境推荐写法
RewriteEngine On # 解决部分主机的RewriteBase路径问题 RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
或者更全面的版本,防止直接访问system/application文件夹:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] </IfModule>
如果是Nginx服务器
很多云主机现在用Nginx,这时候.htaccess完全不起作用,需要在Nginx站点配置里添加这段规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
修改后需要重启Nginx服务,同时可以把根目录的.htaccess重命名或者删除。
4. 验证文件权限
确保项目根目录下的application文件夹,以及子文件夹cache、logs的权限设置正确,一般设置为755(部分主机可能要求777),权限不足会导致框架无法生成缓存或日志,间接影响路由解析。
5. 测试基础路由排除代码问题
先访问框架默认的Welcome控制器:http://142.93.173.123/welcome,如果这个也404,那肯定是前面的服务器或配置问题;如果能正常访问,那就要检查你自定义控制器的命名(CodeIgniter要求控制器名首字母大写)、路由规则是否正确,或者是否存在大小写不匹配的问题。
内容的提问来源于stack exchange,提问作者Muzaffer Bulut

