xampp中ci项目404的根本原因是apache未将请求交给index.php,需确保mod_rewrite启用、allowoverride all生效、.htaccess置于项目根目录并含正确重写规则,同时配置uri_protocol为path_info或request_uri。

Apache没把请求交给CI,.htaccess根本没生效
你改了routes.php、清空了$config['index_page'],但访问/news/123还是404——这不是CI的问题,是XAMPP压根没把请求转给index.php。关键检查点有三个:
-
httpd.conf里LoadModule rewrite_module modules/mod_rewrite.so必须取消注释(默认常被注释) - 所有
<directory></directory>块里的AllowOverride None都要改成AllowOverride All——XAMPP通常在httpd.conf里有2处,别漏掉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才能被正确拆解
URI协议选错导致路由段全丢
即使.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环境下它常为空
伪静态后缀(如.html)要靠路由+配置双驱动
想让/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';
注意\.要转义,否则.会匹配任意字符 - 如果同时支持带后缀和不带后缀的URL,得写两条路由:
$route['article/(\d+)'] = 'article/show/$1'; $route['article/(\d+)\.html'] = 'article/show/$1';
Nginx用户别碰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参数丢失 - 如果项目不在Web根目录(比如
/var/www/html/blog/),root路径必须配准,且/index.php是相对于root的路径
路由段解析依赖fastcgi_split_path_info开启,否则PATH_INFO为空,CI拿不到$1。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











