这是一个非常愚蠢的问题,对不起。有一个庞大且相当复杂的系统有一个错误,我设法跟踪它到这件
return str_replace('%2F', '/', rawurlencode(str_replace('%20', ' ', $key)));
有一条评论解释了为什么要更换斜线 - 以保留路径结构,例如: encoded1 / encoded2 /等。但是,没有任何解释为什么%20被空格替换,而那部分是bug的直接原因。我很想删除str_replace(),但看起来它出于某种原因放在那里,我觉得我会通过这样做打破别的东西。有没有人遇到类似的东西?也许这是一些PHP错误的脏修复?任何猜测和见解都非常感谢!
答案 0 :(得分:1)
首先想到的是反对双重编码的缓解技术。
并不是说我会建议以这种方式做这样的事情,因为它会迅速变得真正凌乱(并且人们已经想知道为什么只有那个实体,也许'他们'从来没有遇到任何其他人的问题......)。
答案 1 :(得分:1)
这可能是对rawurlencode()
vs urlencode()
urlencode()
用+
符号替换空格
如果原作者认为rawurlencode()
做了同样的事情,他们会尝试对空格进行预编码,这样就不会变成+
s
答案 2 :(得分:1)
这样做会阻止%20
(编码空间)被编码为%2F20
。但是,它只能防止双重逃逸的空间;其他特殊字符仍然会被双重编码。
这是代码不好的标志;传入此函数的字符串不应该被允许首先使用编码字符。
我建议创建覆盖所有引用代码的单元测试,然后重构此函数以删除str_replace()
以确保它不会破坏测试。