【问题标题】:Should an ampersand be URL encoded in a query string?与号是否应该在查询字符串中进行 URL 编码?
【发布时间】: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


【解决方案1】:

& 用于在 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。URL还是/github-btn.html?user=example&amp;repo=card&amp;type=watch&amp;count=true。)

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

【讨论】:

    【解决方案2】:

    来自rfc3986

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

      reserved    = gen-delims / sub-delims
    
      gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
    
      sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="
    

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

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

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

    【讨论】:

    • 您的回答不包括 rfc1866 方面。此处“分隔”字符的含义在您的代码示例中不可见。您显示的报价基本上告诉何时转义保留字符。示例:/?user=tester&amp;password=123&amp;456 第一个 &amp; 是分隔符,第二个 &amp; 不是。正确的是:/?user=tester&amp;amp;password=123%26456htmlentities() 来自 rfc1866 "3.2.1. Data Characters":&amp; 是一个数据字符(用于引入实体)。在 HTML 中正确的是:/?user=tester&amp;amp;password=123%26456。 html 实体必须以所有 HTML 属性值编码。
    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 2017-07-22
    • 2018-08-18
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多