.htaccess Mod重写,B标志不适用于空格,AH10411:重写的查询字符串包含控制字符或空格

uyto3xhc  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(171)

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没有工作。

m4pnthwp

m4pnthwp1#

RewriteRule ^(.+)$ index.php?QueryString=%{REQUEST_URI} [B,L]

B标志在这里不起作用,因为您没有使用 backreference(您使用的是REQUEST_URI服务器变量)。请尝试以下操作:

RewriteRule ^(.+)$ index.php?QueryString=/$1 [B,L]

当我尝试手动将空格替换为“%20”时:/modulename/searchfuncname/filter,searchstring,quick%20fox%20jumps/服务器将它们替换回来
这不会有什么区别,因为这和第一个请求是一样的。如果你没有在初始请求中显式地对 spaces 进行URL编码,浏览器会为你做这件事(当它发出请求时)-为了生成一个有效的URL。(看看浏览器中的网络流量-你会看到%20,不管你是否手动编码了空间)。
但是,RewriteRulepattern 无论如何都匹配URL解码的URL路径。
但由于某些原因,如果我用“+”符号替换空格,服务器工作。忽略BPN标志。
%20是一个URL编码的 * 空格 *,无论它在URL中的位置如何。但是,URL路径中的+是文字+但是,查询字符串中的+是URL编码的 * 空格 *(替代编码)。所以,是的,如果你在原始请求的URL路径中使用了+,那么它“绕过”了这个问题。**BNP**标志不适用,因为它没有编码 * 空格 *,它只是复制了一个文字+

更新:

如果URL带有/fox/&tail=red等附加参数,则$_GET现在不会进入数组
可能是因为&在结果查询字符串中被URL编码。您可以将编码限制为 * 空格 * 和?(需要Apache 2.4.26+)。例如:

RewriteRule ^(.+)$ index.php?QueryString=/$1 "[B= ?,L]"

&将不再被编码在反向引用中,因此它在查询字符串中的特殊含义仍然适用。
注意:不能只编码 spaces(因为 spaces 不能用作最后一个字符),因此需要额外的?字符。因此,flags 参数需要用双引号括起来。

相关问题