Apache 2.4.23下.htaccess重定向无限循环问题求助
解决Apache 2.4.23中无扩展名URL内部重定向的无限循环问题
我帮你排查这个问题——核心原因是Apache 2.4.23对Rewrite规则变量的处理和2.4.10存在差异,导致你的规则触发了重复匹配,不断给URL追加.html后缀。让我们一步步修复它:
问题根源分析
你的原始规则和修改后的规则都没彻底解决循环,主要有两个问题:
%{REQUEST_FILENAME}是文件系统的绝对路径(比如/var/www/your-site/privacy.html),用它来判断是否以.html结尾并不靠谱,因为路径里的目录名可能干扰判断,而且内部重定向后这个变量的更新逻辑在2.4.23里有变化。- 你添加的
(?!\.html/)前瞻断言是检查URL结尾是否不是.html/,这完全没击中目标——我们需要排除的是以.html结尾的请求,而不是.html/。
修正后的Rewrite规则
替换你现有的重定向规则为以下代码,就能彻底阻止循环,同时保留无扩展名URL的内部重定向功能:
# 内部重定向无扩展名URL到对应.html文件(仅当文件存在且请求不是.html结尾时) RewriteCond %{REQUEST_URI} !\.html$ RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*?)/?$ $1.html [L,QSA]
规则解释
RewriteCond %{REQUEST_URI} !\.html$:直接检查请求的URL路径是否不是以.html结尾,这是阻止循环的关键——当内部重定向到.html文件后,这个条件会立刻不满足,规则不会再次触发。RewriteCond %{REQUEST_FILENAME}.html -f:确保目标.html文件确实存在,避免无效的重定向操作。[L,QSA]:L标记让这是当前请求的最后一条Rewrite规则,QSA保留原始请求的查询字符串。
额外建议
把这条Rewrite规则放在你所有RedirectMatch规则的后面——因为mod_alias的RedirectMatch(就是你那些301/307重定向)会先于mod_rewrite规则执行,先处理完外部重定向,再处理内部的.html映射,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Brian Leishman
相关产品推荐
相关产品推荐

