Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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会对我的查询字符串进行URL解码?_Apache_Cgi_Query String_Urldecode - Fatal编程技术网

为什么Apache会对我的查询字符串进行URL解码?

为什么Apache会对我的查询字符串进行URL解码?,apache,cgi,query-string,urldecode,Apache,Cgi,Query String,Urldecode,我的网络主机拒绝帮我解决这个问题,所以我来到这里的智者那里寻求帮助“黑盒调试”。以下是我发给他们的内容的编辑版本: 我在dreamhost上有两个(以及其他)域: 1) thefigtrees.net 2) 应该为麦凯恩网站投票吗 我今天注意到,当我在#1上主持CGI脚本时 CGI脚本运行时,HTTP GET查询字符串作为查询字符串传递给它 环境变量已被URL解码。这是一个问题,因为 这意味着标准CGI库(如perl的CGI.pm)将尝试 在符号上拆分,然后解码字符串本身。有两个 这方面的潜在问

我的网络主机拒绝帮我解决这个问题,所以我来到这里的智者那里寻求帮助“黑盒调试”。以下是我发给他们的内容的编辑版本:

我在dreamhost上有两个(以及其他)域:

1) thefigtrees.net 2) 应该为麦凯恩网站投票吗

我今天注意到,当我在#1上主持CGI脚本时 CGI脚本运行时,HTTP GET查询字符串作为查询字符串传递给它 环境变量已被URL解码。这是一个问题,因为 这意味着标准CGI库(如perl的CGI.pm)将尝试 在符号上拆分,然后解码字符串本身。有两个 这方面的潜在问题:

1) 字符串被双重解码,因此如果向脚本提交值 例如“%2525”,它将被视为“%”(解码两次) 而不是“%25”(解码一次)

2) (更常见)如果提交的值中有一个符号,则 将以%26的形式(正确)提交,但查询字符串为env。可变意志 如果已经将其解码为“&”,那么CGI库将不正确地 在该符号处拆分查询字符串。这是个大问题

上的脚本演示了这一点。它回荡了过去 使用它调用的环境变量。在浏览器中导航到:

您可以看到请求URI正确地包含x=y%26z(未编码),但是 查询字符串已解码为x=y&z。 如果我在域2重复测试( )我看到 查询字符串保持未编码状态,以便CGI.pm随后拆分和解码 没错

我尝试禁用这两个服务器上的.htaccess文件,以确保这不是问题所在 问题,看不出有什么区别

既然我的网络主人似乎不愿意帮助我,有人能推测出这可能的原因吗

谢谢,
李很好奇。从这里我看不到任何东西能告诉我们为什么会发生这种事。。。我只能确认这是一个环境错误,并怀疑可能存在配置差异,如可能重写规则

根据CGI 1.1,这种解码应该只发生在SCRIPT-NAME和PATH-INFO上,而不是QUERY-STRING上。这种情况的发生毫无意义,也令人恼火,但这就是规范。在需要在路径部分中输入越界字符和Unicode字符的地方,使用REQUEST-URI而不是那些可用的变量(如Apache)是一种常见的解决方法,因此,在主机提供某种解析之前,对查询字符串执行相同的操作可能是合理的


VPS现在很便宜…

我在Apache中也有同样的行为

我相信如果安装了mod_rewrite,它将自动解码URL,但是,即使没有它,我也看到了自动解码行为。我还没有找到另一个罪犯

一个常见的解决方法是对输入参数进行双重编码(利用URL解码在未编码的URL上调用时的安全性)