Apache升级后Mod Rewrite的B/BNP Flag失效,报AH10411错误
解决Apache升级后AH10411错误:含空格URL重写失败
问题根源
Apache 2.4.51及后续版本强化了查询字符串的安全校验,禁止重写后的查询字符串直接包含空格或控制字符。你原配置中使用的%{REQUEST_URI}是Apache解码后的路径,其中的空格是真实空白字符而非编码后的%20,因此无论添加B或BNP flag,都会触发AH10411错误。
解决方案
改用%{THE_REQUEST}提取客户端发送的原始请求路径(保留编码后的%20),替代%{REQUEST_URI}。修改后的.htaccess配置如下:
<IfModule mod_rewrite.c> RewriteEngine On # 从原始请求行中提取编码后的路径部分 RewriteCond %{THE_REQUEST} ^[A-Z]+\s/([^\s?]+)\sHTTP/ # 排除真实存在的文件和目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将编码后的路径传递给QueryString,B flag确保特殊字符正确转义 RewriteRule ^ index.php?QueryString=/%1 [B,L] </IfModule>
原理说明
%{THE_REQUEST}存储的是客户端发送的原始请求内容,格式类似GET /modulename/searchfuncname/filter,searchstring,quick%20fox%20jumps/ HTTP/1.1,其中空格保持%20编码状态。通过RewriteCond提取路径部分后拼接到查询字符串,最终传递给index.php的是编码后的路径,不会包含真实空格,从而绕过安全校验。
额外说明
- 不建议修改Apache全局安全配置(如
AllowEncodedSpace)放行空格,这会降低服务器安全性。 - 若业务需要处理空格,可在
index.php中对QueryString参数进行解码,获取原始空格内容。
内容的提问来源于stack exchange,提问作者Yaroslav Ustinovsky
相关产品推荐
相关产品推荐

