如何解决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
相关产品推荐
相关产品推荐

