Apache重写规则或解决方案,将空格替换为%20
我们现在的处境需要一个好主意。我们有一些嵌入式设备,它们发送GET请求,内部带有空格。也就是说,我们不能改变这一点 我们发现,当更换GSM运营商时,一些设备无法插入数据库,我们发现该运营商不会改变我们的URL(与旧运营商一样),因此设备发送时会出现空白Apache重写规则或解决方案,将空格替换为%20,apache,mod-rewrite,Apache,Mod Rewrite,我们现在的处境需要一个好主意。我们有一些嵌入式设备,它们发送GET请求,内部带有空格。也就是说,我们不能改变这一点 我们发现,当更换GSM运营商时,一些设备无法插入数据库,我们发现该运营商不会改变我们的URL(与旧运营商一样),因此设备发送时会出现空白 GET /gsm/p.php?imei=865733029239522&operator=VODAFONE NL&v1=1&v2=0&v3=1&v4=0 HTTP/1.1" 200 568 "-" "QUE
GET /gsm/p.php?imei=865733029239522&operator=VODAFONE NL&v1=1&v2=0&v3=1&v4=0 HTTP/1.1" 200 568 "-" "QUECTEL_MODULE"
问题变得显而易见,Apache(2.4.18,linux)将在第一个空间(即VODAFONE)之后停止解析,并进一步作为$u服务器[]传递。之后的所有变量都丢失了,因为我们怀疑APACHE认为在第一个空格之后将到达协议类型(HTTP/1.1),这在我们的例子中是不正确的
在修复嵌入式之前,解决这个问题的最佳方法是什么?可能是php问题而不是Apache(我们认为不是)
ProtocolReqCheck
-强制Apache像以前一样工作。
RewriteRule
-这是否可以动态地将“”替换为%20
更新:
ProtocolReqCheck off
就像这个建议不再有效一样,Apache2甚至还没有开始
我已经在.htaccess
中尝试过这个:
RewriteEngine on
RewriteRule (?:\s) %20 [N,DPI]
并使用此网站进行验证
但在这个网站上,有一部分是工作的,就像预期的那样,用%20替换所有空格,但是如果URL不包含任何空格,则将不会返回任何内容
所以基本上我需要
- 如果URL包含空格,请将所有替换为%20
- 如果没有,就按原样离开
RewriteEngine On
RewriteCond %{THE_REQUEST} "^GET\s(.+)\s(.+)\sHTTP/1.1"
RewriteRule ^ "%1\%20%2" [PT]
windows上的apache无法正常工作(日志延迟),因此一旦工作,我就能够捕获重写规则
W:/wamp64/www/one/] RewriteCond: input='GET /one/entry.php?x=sdsfgsdfg dfgsdfgds222 HTTP/1.0' pattern='^GET\\s(.+)\\s(.+)\\sHTTP/1.0' => matched
[Mon Sep 05 19:22:40.573902 2016] [rewrite:trace2] [pid 6664:tid 884] mod_rewrite.c(476): [client 10.10.0.1:50322] 10.10.0.1 - - [localhost/sid#e65e50][rid#1d131e8/initial/redir#10] [perdir W:/wamp64/www/one/] rewrite 'entry.php' -> '/one/entry.php?x=sdsfgsdfg%20dfgsdfgds222'
看来URL确实被转换成了
/one/entry.php?x=sdsfgsdfg%20dfgsdfgds222
但实际页面输出500个内部服务器错误。
也许规则本身正在循环?您可以尝试以下方法:
RewriteEngine On
RewriteCond %{THE_REQUEST} "^GET\s(.+)\s(.+)\sHTTP/1.1"
RewriteRule ^ "%1\%20%2" [PT]
在Apache 2.4.6上测试。好的,@Dusan Bajic非常感谢,非常感谢!找到的解决方案如下:
RewriteEngine On
RewriteCond %{THE_REQUEST} "^GET\s(.*)\s(.*)\sHTTP/1.0"
RewriteRule ^ "%1 %2" [END]
基本上,这将修复我仍然不知道如何修复的[QUERY_STRING]。现在它再次包含空格,因为嵌入式设备将它们发送出去
最初我认为我需要将它们动态转换为%20,这可能是可能的,但条件是进一步的$u包含正确的值(去掉),而不是(可能更复杂的重写也会这样做)
还有一句话,您假设将是HTTP/1.1,但在被空格打断的情况下,Apache将只接受第一个空格之后的任何内容,并将其解释为协议
[SERVER_PROTOCOL] => &var=wonder 123&vtype=OB10&rssi=23,0 HTTP/1.0
[SERVER_PROTOCOL] => HTTP/1.0 <-- this should be
[SERVER\u PROTOCOL]=>&var=wonder 123&vtype=OB10&rssi=23,0 HTTP/1.0
[SERVER_PROTOCOL]=>HTTP/1.0可能的重复您可以假设请求中的最大预期空格数吗?可以(我已经尝试编写一些重写规则,但没有成功)。URL最多有10个空格,您不能再发布您尝试过的内容了吗?感谢使用我尝试过的内容进行的高级编辑不起作用,尽管我启用了mod_rewrite debug,但我在日志中看不到有用的信息。这样,根本不起作用,URL被拒绝这是Apache/2.4.18(Win64)PHP/7.0.10您可以尝试使用[R]
而不是[PT]
,使用curl-v-X GET'http:example.com/gsm/p.php?imei=865733029239522&operator=VODAFONE NL&v1=1&v2=0&v3=1&v4=0进行测试,并检查位置:
,作为响应?我很高兴它终于工作了。现在看来,所需要的只是让请求通过重写引擎一次,而这将逃过not已经转义,因此即使是RewriteCond%{u请求}“^GET\s(.*)\sHTTP/1.0”
RewriteRule^“%1”[END]
也可以工作