如何用mod_rewrite从URL中移除_escaped_fragment参数?
解决.htaccess中移除
_escaped_fragment_的无限循环问题 你的规则陷入无限循环,核心是两个问题:参数拼接格式错误和未清除原查询字符串,导致_escaped_fragment_每次都会被保留并重复触发规则。我们来一步步修复:
问题根源分析
从你的access.log日志能清晰看到问题所在:
::1 - - [19/Mar/2019:15:11:34 +0000] "GET /definition?escaped_fragment=q=retort HTTP/1.1" 302 251
::1 - - [19/Mar/2019:15:11:34 +0000] "GET /definitionq=retort?escaped_fragment=q=retort HTTP/1.1" 302 263
- 你直接把捕获的参数
%1拼在%{REQUEST_URI}后面,没有添加?,导致参数变成了路径的一部分(比如/definitionq=retort),而不是正确的查询字符串格式。 - Apache默认会保留原查询字符串并追加到重写后的URL末尾,所以
_escaped_fragment_=q=retort会一直存在,反复触发RewriteCond规则,造成无限循环。
修复后的规则
替换你现有的规则为以下代码:
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ RewriteRule ^(.*)$ /$1?%1 [NC,R=302,L]
规则细节解释
RewriteCond:匹配查询字符串以_escaped_fragment_=开头的请求,把后面的参数捕获到%1中。RewriteRule:/$1:保留原请求的路径(比如/definition)。?%1:这里的?是关键——它会清除原有的查询字符串,再把%1作为新的查询字符串添加进去,彻底去掉_escaped_fragment_。NC:忽略大小写匹配,增强规则兼容性。R=302:临时重定向,测试验证没问题后可以改成R=301(永久重定向)。L:标记为最后一条规则,停止后续重写处理,避免不必要的匹配。
效果验证
使用这个规则后,原本的/definition?_escaped_fragment_=q=retort会被重定向到/definition?q=retort,查询字符串中不再包含_escaped_fragment_,自然也就不会触发循环了。
内容的提问来源于stack exchange,提问作者Matt Parkins
相关产品推荐
相关产品推荐

