商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > XAMPP运行CodeIgniter:配置index.php隐藏与URI协议参数解析

XAMPP运行CodeIgniter:配置index.php隐藏与URI协议参数解析

  发布于2026-06-18 阅读(0)

扫一扫,手机访问

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

XAMPP运行CodeIgniter:配置index.php隐藏与URI协议参数解析

Apache没把请求交给CI,.htaccess根本没生效

当你改了routes.php、清空了$config['index_page'],但访问/news/123依然404时,不要急着怀疑框架代码。这不是CI的问题,是XAMPP压根没把请求转给index.php。关键检查点有三个:

  • httpd.confLoadModule 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]
    别画蛇添足地加上QSAPT,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 Onmod_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用户别碰iftry_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了。
本文转载于:https://www.php.cn/faq/2669358.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注