在执行PHP rawurlencode()之前用空格替换%20的目的是什么?

在执行PHP rawurlencode()之前用空格替换%20的目的是什么?,php,urlencode,Php,Urlencode,这是一个相当愚蠢的问题,对不起。有一个庞大而复杂的系统有一个bug,我设法找到了它 return str_replace('%2F', '/', rawurlencode(str_replace('%20', ' ', $key))); 有一条注释解释了为什么要替换斜杠-为了保留路径结构,例如encoded1/encoded2/等。但是没有解释为什么用空格替换%20,并且该部分是错误的直接原因。我很想删除str_replace(),但它似乎是出于某种原因放在那里的,我觉得这样做会破坏其他东西。

这是一个相当愚蠢的问题,对不起。有一个庞大而复杂的系统有一个bug,我设法找到了它

return str_replace('%2F', '/', rawurlencode(str_replace('%20', ' ', $key)));

有一条注释解释了为什么要替换斜杠-为了保留路径结构,例如encoded1/encoded2/等。但是没有解释为什么用空格替换%20,并且该部分是错误的直接原因。我很想删除str_replace(),但它似乎是出于某种原因放在那里的,我觉得这样做会破坏其他东西。有人遇到过类似的情况吗?也许这是对一些PHP错误的肮脏修复?任何猜测和见解都将受到高度赞赏

首先想到的是一种针对双重编码的缓解技术


我并不建议这样做,因为这样做会很快变得一团糟(人们已经想知道为什么只有那个实体,也许“他们”从未与任何其他实体……发生过问题)。

这可能是对
rawurlencode()
vs
urlencode()的误解造成的

urlencode()
将空格替换为
+
符号


如果原作者认为
rawurlencode()
做了同样的事情,他们将尝试对空间进行预编码,这样它们就不会变成
+
s

这样做会阻止
%20
(编码空间)被编码到
%2F20
。但是,它仅用于防止双重转义空间;其他特殊字符仍将进行双重编码

这是坏代码的标志;传递到此函数的字符串首先不允许包含编码字符


我建议创建覆盖所有引用代码的单元测试,然后重构此函数以删除
str_replace()
,以确保它不会破坏测试。

看起来确实存在一些双重编码(尤其是
%2F
被替换回斜杠…哎哟,讨厌的代码)+1因为我也经历过同样的兔子洞,这一点都不好玩。这是一个远大的目标,但是这个项目有SVN存储库吗?也许提交历史可以给你一些线索来解释为什么会出现这种情况?是的,我检查了所有提交的历史,遗憾的是,这一行是这样创建的,从未改变过。此外,它是在几个月前添加的,只是为了相对安全地假设这实际上是一个错误。唯一阻止我马上做这个假设的是,这个系统是由一个大公司创建的,这个大公司通常做一些非常专业的事情(好吧,至少到目前为止我有这样的印象)。没有一家公司,不管有多大,都有完美的代码。专业地做事并不意味着代码写得好。事实上,根据我的经验,它的意思往往恰恰相反。专业化的外表掩盖了潜在的代码腐败。但是,如果这个更改是在几个月前才做出的,你能不能问问做出更改的人发生了什么事?你能发布一个传递给该函数的样本值吗?样本值应该是dir1/dir2/file.txt。所讨论的系统是Amazon的PHP SDK。我不确定联系作者有多容易,因为我与那家公司没有直接关系。无论如何,我已经完成了修复,我们将看看他们怎么说:)谢谢大家的帮助!是的,我也想过。然而,他们似乎没有这样做,他们实际上将%20解码回空格,然后将其传递给rawurlencode()