模组重写。 B 标志不适用于空格。 AH10411:重写的查询字符串包含控制字符或空格

问题描述 投票:0回答:1

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

apache .htaccess mod-rewrite
1个回答
0
投票
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,它只是复制文字
+
.


更新:

$_GET
如果 URL 提供了额外的参数,如
/fox/&tail=red

,现在不会进入数组

可能是因为

&
在生成的查询字符串中被 URL 编码。您可以将编码限制为 spaces
?
(需要 Apache 2.4.26+)。例如:

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

&
将不再在反向引用中编码,因此它在查询字符串中的特殊含义仍然适用。

NB:您不能只编码 spaces(因为 spaces 不能用作最后一个字符),因此需要额外的

?
字符。因此,flags 参数需要用双引号括起来。

© www.soinside.com 2019 - 2024. All rights reserved.