和号应该在查询字符串中进行URL编码吗?

时间:2017-01-28 08:11:49

标签: url url-encoding ampersand

例如,我经常看到这个URL出现。

https://ghbtns.com/github-btn.html?user=example&repo=card&type=watch&count=true

&&还是应该/可以保留为&

2 个答案:

答案 0 :(得分:2)

&用于编码HTML中的&符号

例如,在超链接中:

<a href="/github-btn.html?user=example&amp;repo=card&amp;type=watch&amp;count=true">…</a>

(请注意,此only changes the link, not the URL。网址仍为/github-btn.html?user=example&repo=card&type=watch&count=true。)

虽然您可以使用HTML中的&对每个&amp;(内容的一部分)进行编码,但您只需要对ambiguous ampersands进行编码。

答案 1 :(得分:1)

来自rfc3986

  

保留字符
   URI包括由“保留”集中的字符分隔的组件和子组件。这些字符称为“保留”,因为它们可能(或可能不)通过通用语法,每种特定于方案的语法或URI的解除引用算法的特定于实现的语法定义为分隔符。
  ...

  reserved    = gen-delims / sub-delims

  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
  

保留字符的目的是提供一组分隔符   与URI中的其他数据可区分的字符。的URI   用保留字符替换保留字符有所不同   相应的百分比编码八位字节不相等。   百分比编码保留字符,或解码百分比编码   对应于保留字符的八位字节,将改变如何   URI被大多数应用程序解释   ...
  URI生成应用程序应该对数据八位字节进行百分比编码      除非这些字符对应于保留集中的字符      URI方案特别允许表示其中的数据      零件。如果在URI组件中找到保留字符      没有分隔角色对于该角色是已知的,那么它必须是      解释为表示与其对应的数据八位字节      字符在US-ASCII中的编码。

如果URL中的&是值的一部分且没有分隔角色,则应对其进行编码。
这是使用urlencode()函数的简单PHP代码片段:

<?php
    $query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
    echo '<a href="mycgi?' . htmlentities($query_string) . '">';
?>