【发布时间】:2017-06-13 22:39:46
【问题描述】:
例如,我经常看到这个 URL 出现。
https://ghbtns.com/github-btn.html?user=example&repo=card&type=watch&count=true
& 是指& 还是应该/可以保留为&?
【问题讨论】:
标签: url url-encoding ampersand
例如,我经常看到这个 URL 出现。
https://ghbtns.com/github-btn.html?user=example&repo=card&type=watch&count=true
& 是指& 还是应该/可以保留为&?
【问题讨论】:
标签: url url-encoding ampersand
& 用于在 HTML 中编码与符号。
例如,在超链接中:
<a href="/github-btn.html?user=example&repo=card&type=watch&count=true">…</a>
(注意这个only changes the link, not the URL。URL还是/github-btn.html?user=example&repo=card&type=watch&count=true。)
虽然您可以在 HTML 中使用 &amp; 对每个 &(即内容的一部分)进行编码,但您只需对 ambiguous ampersands 进行编码。
【讨论】:
来自rfc3986:
保留字符
URI 包括由“保留”集中的字符分隔的组件和子组件。这些字符被称为“reserved”,因为它们可能(或可能不会)被通用语法、每个特定于方案的语法或 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) . '">';
?>
【讨论】:
/?user=tester&password=123&456 第一个 & 是分隔符,第二个 & 不是。正确的是:/?user=tester&amp;password=123%26456。 htmlentities() 来自 rfc1866 "3.2.1. Data Characters":& 是一个数据字符(用于引入实体)。在 HTML 中正确的是:/?user=tester&amp;password=123%26456。 html 实体必须以所有 HTML 属性值编码。