我们的情况需要一个好主意。我们有一些嵌入式设备可以发送带有空格的GET请求。也就是说,我们无法改变这一点。
我们发现在更改GSM运营商时,某些设备无法插入数据库,我们发现此运营商不会更改我们的网址(如旧版本),因此设备发送时会显示空格
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的第一个空格之后停止解析,并将其作为$ _SERVER []进一步传递。之后的所有变量都丢失了,因为我们怀疑APACHE认为在第一个空格到达协议类型(HTTP / 1.1")之后,这在我们的情况下是不正确的。
直到修复嵌入式,这是解决这个问题的最佳方法吗?可能是一个php问题,而不是Apache(我们认为不是)?
ProtocolReqCheck
- 强迫Apache表现得像过去一样。
RewriteRule
- 这有可能取代' '与%20即时。
更新:
ProtocolReqCheck off
就像这个建议不再起作用,Apache2甚至没有启动http://answers.google.com/answers/threadview/id/368359.html
我已经在.htaccess
中尝试了这个:
RewriteEngine on
RewriteRule (?:\s) %20 [N,DPI]
使用本网站验证 http://htaccess.mwl.be/
但是在这个网站上部分工作,意味着用预期的%20替换所有SPACES,但如果URL不包含任何空格,则不会返回任何内容。
基本上我需要
但是当我在我的Apache中测试时,根本不工作,知道因为插入DB也是错误的。另外,检查Apache access.log时,URL不会被修改。
重写规则后,不应该在access.log中修改
UPDATE2
使用@Dusan代码,正在研究如何进入某些重写循环
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内部服务器错误。 也许规则是循环自己?
答案 0 :(得分:2)
你可以试试这个:
RewriteEngine On
RewriteCond %{THE_REQUEST} "^GET\s(.+)\s(.+)\sHTTP/1.1"
RewriteRule ^ "%1\%20%2" [PT]
在Apache 2.4.6上测试。
答案 1 :(得分:0)
嗯,@ Dusan Bajic非常感谢你,谢谢!找到的解决方案如下:
RewriteEngine On
RewriteCond %{THE_REQUEST} "^GET\s(.*)\s(.*)\sHTTP/1.0"
RewriteRule ^ "%1 %2" [END]
基本上这将修复[QUERY_STRING]我仍然不知道如何。现在它再次包含SPACES,因为嵌入式设备将它们发送出去。
最初我认为我需要将它们转换为%20,这可能是可能的,但条件是进一步$ _GET包含正确的值(剥离)而不是(可能更复杂的重写会做到这一点)太)。
还有一个评论,你假设它将是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
所以基本上我也用SPACE替换了,这很奇怪,用空格替换空间,但是现在,[QUERY_STRING]和所有$ _GET变量都是完整且可用的。
最后,我发现[END]可以工作,也许在这里也可以更精细。
亲切的问候,