Apache更新后,我的服务器开始在URL查询中删除此错误,包含空格:
AH10411:重写的查询字符串包含控制字符或空格
URL如下所示:www.example.com/modulename/searchfuncname/filter,searchstring,quick fox jumps/
.htaccess
如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?QueryString=%{REQUEST_URI} [B,L]
</IfModule>
我尝试添加B
标志,删除B
标志,添加BNP
标志以及两者的组合或无。
没有任何帮助。提供任何URL,服务器丢弃相同的错误。
当我尝试用%20
手动替换空格时:www.example.com/modulename/searchfuncname/filter,searchstring,quick%20fox%20jumps/
服务器替换它们,给出403响应并丢弃AH10411错误。
但是由于某些原因,如果我用+
符号替换空间,服务器就可以工作。忽略BPN
标志。
我尝试了所有的变体,在这个线程中描述:AH10411 error: Managing spaces and %20 in apache mod_rewrite没有工作。
1条答案
按热度按时间m4pnthwp1#
B
标志在这里不起作用,因为您没有使用 backreference(您使用的是REQUEST_URI
服务器变量)。请尝试以下操作:当我尝试手动将空格替换为“%20”时:
/modulename/searchfuncname/filter,searchstring,quick%20fox%20jumps/
服务器将它们替换回来这不会有什么区别,因为这和第一个请求是一样的。如果你没有在初始请求中显式地对 spaces 进行URL编码,浏览器会为你做这件事(当它发出请求时)-为了生成一个有效的URL。(看看浏览器中的网络流量-你会看到
%20
,不管你是否手动编码了空间)。但是,
RewriteRule
pattern 无论如何都匹配URL解码的URL路径。但由于某些原因,如果我用“+”符号替换空格,服务器工作。忽略BPN标志。
%20
是一个URL编码的 * 空格 *,无论它在URL中的位置如何。但是,URL路径中的+
是文字+
但是,查询字符串中的+
是URL编码的 * 空格 *(替代编码)。所以,是的,如果你在原始请求的URL路径中使用了+
,那么它“绕过”了这个问题。**BNP
**标志不适用,因为它没有编码 * 空格 *,它只是复制了一个文字+
。更新:
如果URL带有
/fox/&tail=red
等附加参数,则$_GET
现在不会进入数组可能是因为
&
在结果查询字符串中被URL编码。您可以将编码限制为 * 空格 * 和?
(需要Apache 2.4.26+)。例如:&
将不再被编码在反向引用中,因此它在查询字符串中的特殊含义仍然适用。注意:不能只编码 spaces(因为 spaces 不能用作最后一个字符),因此需要额外的
?
字符。因此,flags 参数需要用双引号括起来。