urlencode vs rawurlencode?

若是我想使用变量建立URL,我有两个选择来编码字符串。 urlencode()rawurlencode()php

究竟有什么区别,哪些是首选的? html


#1楼

我认为空格必须编码为: 安全

  • 在URL路径组件中使用时为%20
  • +在URL查询字符串组件或表单数据中使用时(参见17.13.4表单内容类型

如下示例显示了rawurlencodeurlencode的正确用法: 服务器

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

#2楼

1.究竟有什么不一样之处

惟一的区别在于处理空间的方式: oop

urlencode - 基于遗留实现将空格转换为+ 编码

rawurlencode - 基于RFC 1738将空格转换为%20 url

区别的缘由是由于+在URL中保留而且有效(未编码)。 spa

2.哪一个更好?

我真的很想看到选择其中一个的一些缘由...我但愿可以选择一个并永远使用它而不用大惊小怪。

很公平,我作出这些决定时会遵循一个简单的策略,我将与您分享,但愿它能够提供帮助。

我认为这是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!


#3楼

我相信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时。


#4楼

空格编码为%20 vs. +

在大多数状况下,我看到使用rawurlencode()的最大缘由是由于urlencode将文本空间编码为+ (加号),其中rawurlencode将它们编码为常见的%20

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

我已经特别看到某些接受编码文本查询的API端点指望看到空格的%20 ,所以若是使用加号则会失败。 显然,API实现之间会有所不一样,您的里程可能会有所不一样。


#5楼

简单* rawurlencode路径 - 路径是“?”以前的部分 - 空格必须编码为%20 * urlencode查询字符串 - 查询字符串是“?”以后的部分 - 空格被更好地编码为“+”= rawurlencode一般更兼容

相关文章
相关标签/搜索