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

时间:2013-02-14 16:37:31

标签: php urlencode

这是一个非常愚蠢的问题,对不起。有一个庞大且相当复杂的系统有一个错误,我设法跟踪它到这件

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

有一条评论解释了为什么要更换斜线 - 以保留路径结构,例如: encoded1 / encoded2 /等。但是,没有任何解释为什么%20被空格替换,而那部分是bug的直接原因。我很想删除str_replace(),但看起来它出于某种原因放在那里,我觉得我会通过这样做打破别的东西。有没有人遇到类似的东西?也许这是一些PHP错误的脏修复?任何猜测和见解都非常感谢!

3 个答案:

答案 0 :(得分:1)

首先想到的是反对双重编码的缓解技术。

并不是说我会建议以这种方式做这样的事情,因为它会迅速变得真正凌乱(并且人们已经想知道为什么只有那个实体,也许'他们'从来没有遇到任何其他人的问题......)。

答案 1 :(得分:1)

这可能是对rawurlencode() vs urlencode()

误解的结果

urlencode()+符号替换空格

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

答案 2 :(得分:1)

这样做会阻止%20(编码空间)被编码为%2F20。但是,它只能防止双重逃逸的空间;其他特殊字符仍然会被双重编码。

这是代码不好的标志;传入此函数的字符串不应该被允许首先使用编码字符。

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