&符号是否应该在查询字符串中进行 URL 编码?

Ale*_*ler 5 url url-encoding ampersand

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

https://ghbtns.com/github-btn.html?user=example&repo=card&type=watch&count=true
Run Code Online (Sandbox Code Playgroud)

&意味着&还是应该/可以将其保留为&

uno*_*nor 5

&用于在 HTML 中编码&符号。

例如,在超链接中:

<a href="/github-btn.html?user=example&amp;repo=card&amp;type=watch&amp;count=true">…</a>
Run Code Online (Sandbox Code Playgroud)

(请注意,这只会更改链接,而不是 URL。URL 仍然是/github-btn.html?user=example&repo=card&type=watch&count=true。)

虽然您可以在 HTML 中对每个&(即内容的一部分)&amp;进行编码,但您只需要对不明确的 & 符号进行编码。


Rom*_*est 4

来自rfc3986

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

  reserved    = gen-delims / sub-delims

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

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

保留字符的目的是提供一组可与 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) . '">';
?> 
Run Code Online (Sandbox Code Playgroud)