Apache重写规则B标记无效,无法解决AH10411错误(重写的查询字符串包含控制字符或空格)
Apache重写规则B标记无效,无法解决AH10411错误(重写的查询字符串包含控制字符或空格)
嘿,太懂你这种不想动一堆老HTML文件的痛苦了!之前我也踩过Apache 2.4.56+这个AH10411错误的坑,折腾了好半天才搞明白问题出在哪——你之前用的B flag没生效,核心原因是B的作用范围和你想的不一样!
先给你拆解下问题:你原来的规则是RewriteRule ^scriptname$ /cgi-bin/scriptname.cgi [B,L,QSA],这里的QSA是把原始请求的查询串(就是带空格的show=caption with spaces那部分)直接追加到重写后的URL上,但B flag只负责处理RewriteRule替换字符串里的内容(也就是/cgi-bin/scriptname.cgi这部分),根本碰不到QSA自动带过来的查询串!所以空格还是原封不动,正好撞在Apache 2.4.56+新增的严格检查上,直接报AH10411。
不用改HTML的解决方案来了,直接换一种写法,把查询串手动捕获并通过B flag转义,替代原来的QSA:
# 捕获原始查询字符串 RewriteCond %{QUERY_STRING} ^(.*)$ # 把捕获到的查询串作为替换目标的一部分,让B flag处理其中的空格 RewriteRule ^scriptname$ /cgi-bin/scriptname.cgi?%1 [B,L]
原理很简单:现在查询串是作为RewriteRule替换字符串的一部分(?%1),B flag会自动把%1里的空格转成合法的%20,这样重写后的查询串就符合Apache的要求了,不会再触发AH10411错误。
再给你排除几个之前踩过的坑:
- 加
NE、BNP这些flag完全没用,NE是让Apache不要转义字符,反而会加重问题;BNP是不转义百分号,和空格八竿子打不着。 RewriteOptions AllowAnyURI是允许原始请求里有特殊字符,但重写后的查询串检查还是会触发,所以白搭。- 两次重写的方案太绕,没必要,上面的单条规则就能搞定。
你可以先拿curl测一下:
curl -v "http://你的域名/scriptname?t=title-with-dashes&show=caption with spaces"
如果返回200,日志里也没AH10411了,就说明搞定了,完全不用动那些老HTML文件~
内容来源于stack exchange
相关产品推荐
相关产品推荐

