若是我想使用变量建立URL,我有两个选择来编码字符串。 urlencode()
和rawurlencode()
。 php
究竟有什么区别,哪些是首选的? html
我认为空格必须编码为: 安全
%20
+
在URL查询字符串组件或表单数据中使用时(参见17.13.4表单内容类型 ) 如下示例显示了rawurlencode
和urlencode
的正确用法: 服务器
echo "http://example.com" . "/category/" . rawurlencode("latest songs") . "/search?q=" . urlencode("lady gaga");
输出: 网络
http://example.com/category/latest%20songs/search?q=lady+gaga
若是您反过来编码路径和查询字符串组件会发生什么? 对于如下示例: ide
http://example.com/category/latest+songs/search?q=lady%20gaga
latest+songs
而不是latest songs
q
将包含lady gaga
惟一的区别在于处理空间的方式: oop
urlencode - 基于遗留实现将空格转换为+ 编码
rawurlencode - 基于RFC 1738将空格转换为%20 url
区别的缘由是由于+在URL中保留而且有效(未编码)。 spa
我真的很想看到选择其中一个的一些缘由...我但愿可以选择一个并永远使用它而不用大惊小怪。
很公平,我作出这些决定时会遵循一个简单的策略,我将与您分享,但愿它能够提供帮助。
我认为这是HTTP / 1.1规范RFC 2616 ,它要求“ 容忍的应用程序 ”
在解析请求行时,客户端应该容忍解析状态行和服务器容忍度。
当面对这样的问题时,最好的策略老是尽量地消费并产生符合标准的东西。
因此个人建议是使用rawurlencode
生成符合标准的RFC 1738编码字符串,并使用urldecode
向后兼容并容纳您可能遇到的任何内容。
如今你能够接受个人话,但咱们要证实它......
php > $url = <<<'EOD' <<< > "Which, % of Alice's tasks saw $s @ earnings?" <<< > EOD; php > echo $url, PHP_EOL; "Which, % of Alice's tasks saw $s @ earnings?" php > echo urlencode($url), PHP_EOL; %22Which%2C+%25+of+Alice%27s+tasks+saw+%24s+%40+earnings%3F%22 php > echo rawurlencode($url), PHP_EOL; %22Which%2C%20%25%20of%20Alice%27s%20tasks%20saw%20%24s%20%40%20earnings%3F%22 php > echo rawurldecode(urlencode($url)), PHP_EOL; "Which,+%+of+Alice's+tasks+saw+$s+@+earnings?" php > // oops that's not right??? php > echo urldecode(rawurlencode($url)), PHP_EOL; "Which, % of Alice's tasks saw $s @ earnings?" php > // now that's more like it
看起来PHP确实考虑到了这一点,即便我历来没有遇到任何拒绝这两种格式的人,我想不出更好的策略来采用你的事实策略,对吗?
的nJoy!
我相信urlencode用于查询参数,而rawurlencode用于路径段。 这主要是因为路径段的%20
和查询参数的+
。 请参阅如下有关空格的答案: 什么时候将空间编码为加号(+)或%20?
可是%20
如今也适用于查询参数,这就是rawurlencode老是更安全的缘由。 然而,在编辑的用户体验和查询参数的可读性很重要的状况下,倾向于使用加号。
请注意,这意味着rawurldecode
不会将+
解码为空格( http://au2.php.net/manual/en/function.rawurldecode.php )。 这就是$ _GET老是自动经过urldecode
传递的缘由,这意味着+
和%20
都被解码为空格。
若是您但愿输入和输出之间的编码和解码保持一致,而且您已选择始终使用+
而不是%20
做为查询参数,则urlencode
适用于查询参数(键和值)。
结论是:
路径段 - 始终使用rawurlencode / rawurldecode
查询参数 - 用于解码老是使用urldecode(自动完成),对于编码,rawurlencode或urlencode都很好,只需选择一个是一致的,特别是在比较URL时。
%20
vs. +
在大多数状况下,我看到使用rawurlencode()
的最大缘由是由于urlencode
将文本空间编码为+
(加号),其中rawurlencode
将它们编码为常见的%20
:
echo urlencode("red shirt"); // red+shirt echo rawurlencode("red shirt"); // red%20shirt
我已经特别看到某些接受编码文本查询的API端点指望看到空格的%20
,所以若是使用加号则会失败。 显然,API实现之间会有所不一样,您的里程可能会有所不一样。
简单* rawurlencode路径 - 路径是“?”以前的部分 - 空格必须编码为%20 * urlencode查询字符串 - 查询字符串是“?”以后的部分 - 空格被更好地编码为“+”= rawurlencode一般更兼容