You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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. 你直接把捕获的参数%1拼在%{REQUEST_URI}后面,没有添加?,导致参数变成了路径的一部分(比如/definitionq=retort),而不是正确的查询字符串格式。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:29:23