我今天更新了 Apache(至 2.4.56-1),以前可以正常工作的大量 .htaccess 重写现在出现 AH10411 错误,与查询中的空格有关。我正在寻找“正确”的解决方案……
我今天更新了 Apache(至 2.4.56-1),以前可以正常工作的大量 .htaccess
重写现在都收到 AH10411 错误,与查询中的空格有关。我正在寻找“正确”的解决方案。
用户点击一个链接,如 <a href='FISH%20J12345.6-78919'>clickme</a>
你所见,链接 URL 中的空格已被编码为 %20
.
相关服务器目录中的文件包含并执行该相关指令 .htaccess
:
RewriteRule ^(FISH\s*J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1 [L,QSA]
(在上面,我检查的是空格,而不是 %20
,因为浏览器似乎在满足此规则之前将其转换为空格)。
在我更新 Apache 之前,这个功能一直有效;现在用户收到 403 错误,并且我的 Apache 错误日志报告:
AH10411:重写的查询字符串包含控制字符或空格
这似乎是一个新的错误,因为用谷歌搜索没有找到任何结果!
编辑我的页面(例如)将空格更改为下划线并正确处理它实际上不是一个选择,因为设计旨在支持用户能够使用他们关心的对象的名称直接输入 URL。到目前为止,我发现的唯一解决方法有点丑陋,即在正则表达式中分别捕获源名称的两个部分,因此:
RewriteRule ^(FISH)\s*(J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1+$2 [L,QSA]
^ ^ ^^^
(我 $1%20$2
最后尝试了一下,也出现了同样的错误。)
有没有更好的解决方案?例如,当我想要捕获 URL 中的空格并将其作为参数传递给底层页面时,我应该如何处理它?
我们在最近修补的 RHEL 8 系统中遇到了类似的问题,该系统将 Apache 更新到 2.4.37-51。这个:RewriteRule ^foo/bar/(.*)$ https://example.com/ab?cd=search&ef=1&q=$1 [L] 当 $1 中有空格时停止工作,我认为编码为 %20。当触发上述重写时,我们使用 CloudFront 的站点会出现 CloudFront 错误。改用这个:RewriteRule ^foo/bar/(.*)$ https://example.com/ab?cd=search&ef=1&q=$1 [B,L,NE] 似乎可以解决这个问题。不再出现 CloudFront 错误,重定向有效,将空格编码为 + 或 %2b。谢谢 @MrWhite!