为什么查询字符串' s =和&没编码?

时间:2017-07-23 20:36:38

标签: php http

为什么我们不编码=和&在查询字符串?我正在引用RFC 3986,但无法找到我们不应该编码这些字符的位置。使用Guzzle,它们似乎并没有真正编码。

query string: key1='1'&key2='2'为例,不应将其编码为key1%3D%271%27%26key2%3D%272%27吗?如果我将key1='1'&key2='2'作为查询字符串插入Chrome(例如www.google.com?key1='1'&key2='2'),则会显示为key1=%271%27&key2=%272%27,与guzzle不匹配。 Guzzle输出key1='1'&key2='2'。 Guzzle的编码算法如下:

private static $charUnreserved = 'a-zA-Z0-9_\-\.~';

private static $charSubDelims = '!\$&\'\(\)\*\+,;=';

public function encode()
{
    return preg_replace_callback(
        '/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
        function ($match) {
            return urlencode($match[0]);
        },
        $str
    );
}

1 个答案:

答案 0 :(得分:1)

=&没有任何特殊含义作为网址语法的一部分。就URL语法而言,它们只是普通的字符。

但是,在查询字符串中使用时,大多数应用程序框架都实现了一种约定,用它来分隔参数和值。如果要在参数名称或值中使用这些字符,则需要对它们进行编码。见escaping ampersand in url