像
这样的网址http://localhost/path?a=b&c=d
很好 - 但是带有尾随&符号的同一网址的状态是什么?
http://localhost/path?a=b&c=d&
例如,Java Servlet API允许Scala's Spray不允许它(即它会抛出错误)。
我试图在URI syntax spec中找到答案,但不确定如何解析他们的语法。
答案 0 :(得分:23)
URI语法规范适用于通用URI。它允许query中的任何内容。我不知道任何实际指定&符号分隔的键=值对的规范。我认为这仅仅是惯例。我知道PHP,例如,提供了使用不同分隔符的选项。但是现在,每个人在需要键值对时都会使用与号分隔的东西。你偶尔会遇到一些使用它的东西只是一个简单的字符串,例如http://example.com/?example。这完全有效。
但基本答案是,&
在查询字符串中的任何位置都有效,包括在最后。
解密RFC语法或为什么&
在查询字符串中的任何位置有效:
首先,你有
query = *( pchar / "/" / "?" )
(因此查询字符串由任意数量的pchar
和文字斜杠和问号组成。)
回去,你有
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
早些时候仍然
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
因此&
中的文字sub-delims
位于pchar
中,因此它在query
答案 1 :(得分:6)
我认为有一条不成文的规则,即所有RFC都几乎无法理解。你不是第一个无法解析语法的人 - 而且 - 在我的拙见中 - Spray也失败了。
尾随的&符号没有任何问题。它是用于分隔参数的URI中的合法字符。尾随的&符号可能毫无意义,但它并非无效。喷雾应该(再次,仅在我看来)只是忽略它。
答案 2 :(得分:0)
如果您在纯文本电子邮件中有如下网址:
请点击此链接 https://server/doc?param=test.
重置您的帐户密码。
它成为一个有用的功能,因为如果最后一个参数以“.”(点+空格)结尾并被放置在电子邮件中,则所有类型的邮件客户端都假定点是一个句子的结尾并将其排除在如果检测到 URL,他们会添加可点击的链接。
并非所有邮件客户端都支持在双引号或尖括号之间放置链接,并且默认 URL 编码会留下点,因为它不是保留的 URI 字符...
我最终在 URL 后附加了一个与号“&”来解决这个问题,虽然我疯了,但它确实有效。