You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Apache中两条Rewrite规则引发的无限重定向问题?

解决CodeIgniter中移除/index.php时的无限重定向问题

嘿,我完全懂你遇到的麻烦——把那两条Rewrite规则一起用就触发无限循环,单独跑却没问题,这事儿确实挺头疼的。咱们先搞清楚循环的根源,再给你搞定它。

问题根源

你原来的第一条规则是通过%{REQUEST_URI}来匹配带/index.php/的请求,但Apache内部执行第二条规则(把请求转发到index.php/$1)的时候,REQUEST_URI会被改写为/index.php/dashboard/example/,这就又触发了第一条规则的重定向,如此往复就陷入了循环。

解决方案:用THE_REQUEST变量避免内部触发

THE_REQUEST记录的是用户发送的原始HTTP请求行(比如GET /index.php/dashboard/example/ HTTP/1.1),它不会被Apache内部的Rewrite操作修改。用它来匹配重定向规则,就能确保只有用户实际请求了带/index.php/的URL时才会触发重定向,内部转发的请求不会被这条规则捕获。

修改后的完整.htaccess代码

# 开启Rewrite引擎(确保这行在最前面)
RewriteEngine On

# 重定向所有带/index.php的URL到不带的版本(永久重定向301)
# 只匹配用户实际发起的带/index.php的请求,不会触发内部循环
RewriteCond %{THE_REQUEST} ^GET\ /index\.php/(.*)\ HTTP [NC]
RewriteRule ^index\.php/(.*)$ /$1 [L,R=301,QSA]

# 将非文件、非目录的请求转发到index.php,支持CodeIgniter路由
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

配套CodeIgniter配置修改

别忘了在application/config/config.php里把index_page设置为空字符串,这样CodeIgniter生成的URL默认就不会带index.php了:

$config['index_page'] = '';

额外检查项

  • 确保XAMPP里的Apache已经开启了mod_rewrite模块:打开xampp/apache/conf/httpd.conf,检查LoadModule rewrite_module modules/mod_rewrite.so这一行没有被注释(去掉前面的#)。
  • 确保你的.htaccess文件放在CodeIgniter的根目录(和index.php同级)。

这样调整之后,既可以把http://localhost/index.php/dashboard/example/重定向到http://localhost/dashboard/example/,也不会触发无限循环,完美实现你的需求~

内容的提问来源于stack exchange,提问作者Astabiwl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:29:52