Apache 2.4 AH00124内部重定向超限报错求助(Windows环境)
这个报错AH00124: Request exceeded the limit of 100 internal redirects本质是RewriteRule触发了无限循环重写——每次重写后的URL又匹配了同一条(或多条)规则,反复触发直到达到Apache默认的100次限制,最终返回500错误。结合你的环境(Windows Server 2008 R2 + Apache 2.4 64位 + PHP7.1),我给你一步步排查和解决的方案:
1. 开启重写调试日志,精准定位循环源头
想要快速找到问题,必须看每一次重写的详细过程。修改Apache的httpd.conf配置:
# 替换原有LogLevel行 LogLevel debug rewrite:trace6
重启Apache服务后,访问任意一个报错的页面,再查看Apache错误日志(通常在Apache24/logs/error.log)。你会看到类似这样的回溯信息:
[debug] mod_rewrite.c(483): [client xxx.xxx.xxx.xxx] xxx.xxx.xxx.xxx - - [localhost/sid#7ff6b80008a8][rid#7ff6b80140a0/initial] rewrite '/index.php' -> '/index.php'
[debug] mod_rewrite.c(483): [client xxx.xxx.xxx.xxx] xxx.xxx.xxx.xxx - - [localhost/sid#7ff6b80008a8][rid#7ff6b80140a0/initial] applying pattern '^(.*)$' to uri '/index.php'
从这些日志里能清楚看到哪条规则在反复匹配同一个URL,这就是循环的根源。
2. 排查.htaccess重写规则的常见问题
结合Windows环境的特性,重点检查以下几点:
① 未排除真实存在的文件/目录
这是最常见的循环原因!很多PHP框架的重写规则会把所有请求导向index.php,但如果没加排除条件,当请求index.php本身时,规则会再次触发,导致无限循环。
错误示例(无排除条件):
RewriteEngine On RewriteRule ^(.*)$ index.php/$1 [L]
正确写法(先排除真实文件和目录):
RewriteEngine On # 排除已存在的静态文件(如css、js、图片) RewriteCond %{REQUEST_FILENAME} !-f # 排除已存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 仅对非真实文件/目录的请求重写 RewriteRule ^(.*)$ index.php/$1 [L]
② RewriteBase设置错误(非根目录站点)
如果你的站点部署在Apache的子目录下(比如http://yourdomain.com/app/),必须设置RewriteBase,否则重写后的路径会指向根目录,导致循环或404。
正确示例:
RewriteEngine On RewriteBase /app/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
③ Windows大小写不敏感的坑
Apache在Windows下默认不区分URL大小写,但如果重写规则里的文件名(比如Index.php)和实际文件(index.php)大小写不一致,虽然能访问,但可能触发额外的重写检查,间接导致循环。建议规则里的文件名和实际文件保持完全一致。
④ 规则正则过于宽泛或目标URL再次匹配规则
比如这条规则会直接导致循环:
RewriteRule ^.*$ /index.php [L]
因为正则^.*$会匹配所有URL,包括重写后的/index.php,所以会反复触发。必须通过RewriteCond排除目标URL:
RewriteCond %{REQUEST_URI} !^/index.php$ RewriteRule ^.*$ /index.php [L]
3. 确认Apache重写模块和.htaccess权限
确保你的Apache配置已经正确启用了mod_rewrite,并且允许.htaccess生效:
- 在
httpd.conf里确认加载了重写模块:LoadModule rewrite_module modules/mod_rewrite.so - 在站点对应的
<Directory>配置里设置AllowOverride All(否则.htaccess的规则不会生效):<Directory "C:/Apache24/htdocs/your-site"> AllowOverride All Require all granted </Directory>
4. 临时缓解方案(不推荐作为最终解决)
如果需要临时恢复服务,可以修改LimitInternalRecursion参数增加重写限制次数,但这只是治标不治本,最终还是要修复规则:
# 在httpd.conf或虚拟主机配置里添加 LimitInternalRecursion 200
如果看完调试日志还是找不到问题,可以把你的.htaccess完整内容和日志里的重写回溯片段贴出来,我帮你进一步分析。
内容的提问来源于stack exchange,提问作者Truduc Ulu

