Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache重写规则或解决方案,将空格替换为%20_Apache_Mod Rewrite - Fatal编程技术网

Apache重写规则或解决方案,将空格替换为%20

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运营商时,一些设备无法插入数据库,我们发现该运营商不会改变我们的URL(与旧运营商一样),因此设备发送时会出现空白

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
  • 如果没有,就按原样离开
但是,当我在Apache中测试时,它根本不起作用,因为在DB中插入也是错误的

重写规则后,是否不应在access.log中修改

更新2

使用@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个内部服务器错误。 也许规则本身正在循环?

您可以尝试以下方法:

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]
也可以工作