【问题标题】:Why is the comma URL encoded?为什么要对逗号 URL 进行编码?
【发布时间】:2012-01-12 00:34:10
【问题描述】:

在 ASP.NET MVC 中调试时,我看不出两者之间的区别:

http://mysite.com?q=hi,bye

http://mysite.com?q=hi%2Cbye

查询字符串参数“q”的值始终为“hi,bye”。

那么为什么要对逗号进行编码呢?

我想做这样的事情https://stackoverflow.com/a/752109/173957

我有这个表格:

<form method="GET" action="/Search">
     <input type="hidden" name="q" value="hi,bye"/>
     <input type="submit" value="ok"/>
</form>

如何防止这个值被编码?

【问题讨论】:

  • 为什么要防止它被编码? ASP.NET 会自动为你解码,有什么问题呢?
  • 我猜 ?q=hi,bye 比 ?q=hi%2Cbye 更具可读性。另外,我大多只是好奇。
  • 几年前,我在我的查询字符串值中明确使用了一个逗号,原因是它未编码,因此在地址栏。遗憾的是,一些库/浏览器现在对其进行了编码。

标签: asp.net-mvc forms query-string urlencode


【解决方案1】:

URI 规范 RFC 3986 指定 URI 路径组件不包含未编码的保留字符,逗号是保留字符之一。对于 sub-delims,例如逗号,不对其进行编码可能会导致字符在 URI 方案中被视为分隔符语法。百分比编码它保证字符将作为数据传递。

【讨论】:

  • 在问题中,逗号不在 URI 路径组件中,而是在 URI 查询组件中,根据 RFC 3986,其中可能包含包含逗号的子分隔符。
  • 如果我正确阅读规范:path = path-absolute => path-absolute = "/" [ segment-nz *( "/" segment ) ] => segment = *pchar => pchar = unreserved / pct-encoded / sub-delims / ":" / "@" => sub-delims = "!" / "$" / "&amp;" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="。因此,逗号在 URI 段、查询或片段中是有效的。
  • @joeyhoer So a comma is a valid in a URI segment,可能你的意思是invalid
  • @Webber: 否:逗号在句段中有效,因为segments 由pchars(路径字符)、pchars 组成可能包括sub-delims,而sub-delims 包括逗号。
  • 更新了指向 URI 规范的链接:datatracker.ietf.org/doc/html/rfc3986
【解决方案2】:

我发现了这个不需要 URL编码的字符列表: http://web.archive.org/web/20131212154213/http://urldecoderonline.com/url-allowed-characters.htm

更新
由于原始链接断开,我使用 archive.org 从 2013 年 12 月的页面中获取以下文本

允许的 URL 字符列表

未保留 - 可以编码但没有必要

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 - _ . ~

保留 - 有时必须编码

! * ' ( ) ; : @ & = + $ , / ? % # [ ]

【讨论】:

  • 似乎不再工作,页面被广告网站取代。
【解决方案3】:

这真的取决于浏览器。浏览器采用 HTML 表单并根据表单的输入决定如何构建 URL。

如果您使用的是非常旧的(或编程不佳的)浏览器,它可能不会对逗号进行编码。如果你遵守 RFC 标准,它确实应该被编码。

如果您想阻止所有浏览器对逗号进行编码,则必须使用 JavaScript 并自己构建 URL。

<script lang="JavaScript">
    document.location.href = "/Search?q=hi,bye";
</script>

无论如何,这都没有关系,因为无论如何你都应该解码查询字符串参数,结果是一样的。

【讨论】:

  • 是的,使用js肯定可以防止查询参数被编码。
【解决方案4】:

有几个字符具有特殊含义(如 + ? # 等)或直接不允许在 URL 中使用(如空格、逗号等)。要在 URL 中使用此类字符,您需要对它们进行编码和解码。 Read more Here

ASP.NET 会像这样自动编码和解码所有必需的字符,因此您不必担心它们。

【讨论】:

  • 但是逗号被编码并没有真正的意义。即使在您提供的链接中,也没有提到逗号是非法字符。即使在您提供的链接的试用部分中,“hi,bye”在编码后也没有任何不同。
  • 逗号在 URL 中具有特殊含义,因为它表示段参数。请参阅this 链接。寻找数据、地理和 ldap 方案
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2016-01-27
  • 2022-01-14
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多