apache路由重写死循环表现为err_too_many_redirects或ah00124错误,需开启rewrite:trace3日志定位闭环、膨胀、误卷入三类问题,通过加[l]、守门条件、排除自身及区分内外重写修复。

Apache 中路由重写规则冲突引发的死循环,最典型表现是浏览器报 ERR_TOO_MANY_REDIRECTS,或服务器错误日志里反复出现 AH00124: Request exceeded the limit of 10 internal redirects。这不是配置“没生效”,而是规则在内部反复触发、自我匹配,必须靠日志看清每一步走向才能破局。
开启重写追踪日志,让 Apache “说出它做了什么”
默认日志不记录重写过程,得手动打开详细跟踪:
- 在对应虚拟主机或主配置中添加:
LogLevel warn rewrite:trace3(trace3 足够看清匹配与改写,trace8 过于冗长) - 保存后执行
sudo systemctl reload apache2(Debian/Ubuntu)或sudo systemctl reload httpd(RHEL/CentOS) - 复现一次出问题的请求(比如访问首页或某个 API 路径)
- 立刻查错误日志:
sudo tail -50 /var/log/apache2/error.log或sudo tail -50 /var/log/httpd/error_log - 搜索该请求的 client IP 或 URI 片段,找到以
[rewrite:trace3]开头的连续多行日志
重点盯住三类危险信号
在 trace 日志里,逐行看 INPUT URI 和 REWRITE URI 的变化,特别注意:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
自我重写闭环:比如看到
/index.php → /index.php或/api/user → /index.php?r=api/user → /api/user,说明规则没加守门条件,目标路径又重新命中自身 -
路径不断膨胀:如
/login → /index.php?path=login → /index.php?path=index.php%3Fpath%3Dlogin,大概率是正则没限制、漏了[L],或用了[R]却没意识到这是外部跳转 -
静态资源被误卷入:图片、CSS、JS 请求也进了重写链,例如
/css/app.css → /index.php?path=css/app.css,说明RewriteCond %{REQUEST_FILENAME} !-f和!-d缺失或位置不对
修复关键动作:守门、截断、分清内外
找到循环点后,针对性调整规则逻辑:
- 所有重写规则末尾加上
[L],避免后续规则意外介入 - 对入口类规则(如强制 HTTPS、统一 www),前置加
RewriteCond守门:RewriteCond %{HTTPS} off或RewriteCond %{HTTP_HOST} !^www\. - 若重写目标是 PHP 入口(如
index.php),必须排除它自己再被重写:RewriteCond %{REQUEST_URI} !^/index\.php - 区分用途:内部重写(URL 地址栏不变)用
RewriteRule ... [L];外部跳转(地址栏变)才用[R=301],且尽量合并跳转逻辑,避免多跳链
别碰 LimitInternalRecursion,除非你已确认无循环
这个值默认是 10,是安全熔断点,不是性能开关。调高它只是掩盖问题,不能解决根本循环。只有当你已加全守门条件、[L] 无遗漏、trace 日志确认每步都合理,且业务确实需要更深嵌套(比如微前端+国际化前缀+API 代理三层重写),才考虑临时设为 15,并持续监控日志是否仍有 AH00124 报出。










