如何配置Apache mod_rewrite使用L标志位有效终止多余规则循环处理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计813个文字,预计阅读时间需要4分钟。
L 标志本身体不阻止重定向循环,它只停止当前请求周期内的重定向规则匹配;真正的循环发生在浏览器收到 R(重定向)响应后,如果发生新的请求,Apache 会将这当作一个全新的请求重新走一遍所有规则——L 对这个新请求无效。
为什么加了 [L] 还会死循环
典型场景是这类规则:
RewriteRule ^(.*)$ /111/$1 [R,L]
浏览器访问 /index.html → 302 跳转到 /111/index.html → 浏览器再发请求 → Apache 再次匹配 ^(.*)$ → 又跳到 /111/111/index.html,无限套娃。
[L] 确实让这条规则后面不再执行,但它不阻止重定向触发的新请求被再次捕获。关键点在于:R 和 L 是两件事:前者发 HTTP 响应,后者仅控制本周期规则链。
-
R触发外部跳转,浏览器参与进来 -
L只作用于当前内部处理流程,对下一次请求无约束力 - 没有
RewriteCond排除已重写路径,规则就会反复命中
RewriteCond 必须配合 RewriteRule 使用
真正终止循环的方式,是在规则前加条件判断,确保目标路径不被再次匹配。
本文共计813个文字,预计阅读时间需要4分钟。
L 标志本身体不阻止重定向循环,它只停止当前请求周期内的重定向规则匹配;真正的循环发生在浏览器收到 R(重定向)响应后,如果发生新的请求,Apache 会将这当作一个全新的请求重新走一遍所有规则——L 对这个新请求无效。
为什么加了 [L] 还会死循环
典型场景是这类规则:
RewriteRule ^(.*)$ /111/$1 [R,L]
浏览器访问 /index.html → 302 跳转到 /111/index.html → 浏览器再发请求 → Apache 再次匹配 ^(.*)$ → 又跳到 /111/111/index.html,无限套娃。
[L] 确实让这条规则后面不再执行,但它不阻止重定向触发的新请求被再次捕获。关键点在于:R 和 L 是两件事:前者发 HTTP 响应,后者仅控制本周期规则链。
-
R触发外部跳转,浏览器参与进来 -
L只作用于当前内部处理流程,对下一次请求无约束力 - 没有
RewriteCond排除已重写路径,规则就会反复命中
RewriteCond 必须配合 RewriteRule 使用
真正终止循环的方式,是在规则前加条件判断,确保目标路径不被再次匹配。

