发布于2026-06-18 阅读(0)
扫一扫,手机访问
在XAMPP环境下折腾CodeIgniter项目时,最让人头疼的莫过于明明改好了路由、清空了index_page,访问 /news/123 却还是白屏一个404。这其实不是CI的问题,而是从一开始,Apache就没打算把请求交给index.php来处理。核心症结往往集中在三个方面:mod_rewrite到底有没有被启用、AllowOverride是否设成了All、以及.htaccess文件是不是放错了位置、写对了规则。

当你改了routes.php、清空了$config['index_page'],但访问/news/123依然404时,不要急着怀疑框架代码。这不是CI的问题,是XAMPP压根没把请求转给index.php。关键检查点有三个:
httpd.conf里LoadModule rewrite_module modules/mod_rewrite.so这一行必须取消注释——默认情况下它常被注释掉,这对新手来说是第一道隐形陷阱。块里的AllowOverride None都要改成AllowOverride All。XAMPP通常在httpd.conf里有两处这样的配置,别只改了一个,漏掉了htdocs目录那块。.htaccess必须放在项目根目录(和index.php同级),内容用下面这个最稳版本:RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]别画蛇添足地加上QSA或PT,CI 3.x 默认走PATH_INFO模式,index.php/$1才能被正确拆解。即便.htaccess已经生效,你写的那条$route['news/(d+)'] = 'article/show/$1';也可能匹配不上。这时候大概率是$config['uri_protocol']设错了。XAMPP默认用AUTO,但在多数本地环境它会误判为QUERY_STRING,结果PATH_INFO直接为空。
解决方案很直接:改成
$config['uri_protocol'] = 'PATH_INFO';如果还不行,再试试
REQUEST_URI。两者区别在于:
PATH_INFO依赖Apache的AcceptPathInfo On和mod_rewrite输出,XAMPP默认支持。REQUEST_URI直接读取原始URL,但前提是.htaccess里没有用QSA干扰解析。ORIG_PATH_INFO——在PHP-FPM环境下它经常是空的。想让/article/123.html映射到article/show/123?光写路由是不够的,还得配合url_suffix:
config.php里加:$config['url_suffix'] = '.html';这样
site_url('article/show/123')才会自动补上.html。$route['article/(d+).html'] = 'article/show/$1';注意
.需要转义,否则它会匹配任意字符,规则就乱了。$route['article/(d+)'] = 'article/show/$1'; $route['article/(d+).html'] = 'article/show/$1';这样才能两头都照顾到。
if,try_files才是唯一正解XAMPP默认用Apache,但如果你换到了Nginx(比如用XAMPP-Nginx套件或Docker),if (!-e $request_filename)这种写法会触发Nginx官方明确警告的“意外跳转”,很可能返回404或循环重定向。
正确的做法是用try_files兜底:
location / {
try_files $uri $uri/ /index.php?$query_string;
}但这里有几个小细节需要注意:
$uri和$uri/之间不能有空格——网上常见这个错误。/index.php?$query_string中的?是分隔符,不是可选的——漏掉的话会导致GET参数丢失。/var/www/html/blog/),root路径必须配准,且/index.php是相对于root的路径。fastcgi_split_path_info开启,否则PATH_INFO为空,CI也就拿不到$1了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8