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 错误:在 apache mod_rewrite 中管理空间和 %20 没有工作。
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
)。
但是,是的,
RewriteRule
pattern 匹配 URL 解码的 URL 路径。
但出于某种原因,如果我用“+”号替换空格,服务器可以正常工作。无视 BPN 标志。
%20
是 URL 编码的space,不管它在 URL 中的什么地方使用。但是,URL 路径中的 +
是文字 +
(加号)。但是,查询字符串中的 +
是 URL 编码的 space(替代编码)。所以,是的,如果您在原始请求的 URL 路径中使用了+
,那么它会“绕过”这个问题。 BNP
标志不适用,因为它没有编码 space,它只是复制文字 +
.
更新:
如果 URL 提供了额外的参数,如$_GET
,现在不会进入数组/fox/&tail=red
可能是因为
&
在生成的查询字符串中被 URL 编码。您可以将编码限制为 spaces 和 ?
(需要 Apache 2.4.26+)。例如:
RewriteRule ^(.+)$ index.php?QueryString=/$1 "[B= ?,L]"
&
将不再在反向引用中编码,因此它在查询字符串中的特殊含义仍然适用。
NB:您不能只编码 spaces(因为 spaces 不能用作最后一个字符),因此需要额外的
?
字符。因此,flags 参数需要用双引号括起来。