URL中的参数分隔符,误用问号的情况

Posted

技术标签:

【中文标题】URL中的参数分隔符,误用问号的情况【英文标题】:Parameter separator in URLs, the case of misused question mark 【发布时间】:2012-03-20 05:31:27 【问题描述】:

我不太明白使用“?”的好处而不是 '&' 在网址中:

如果我们使用不同的字符作为第一个分隔符,那么任何人的生活都会变得更轻松。 你能想出一个合理的解释吗?

编辑:经过更多研究,我发现“&”可以是文件名(terms&conditions.html)的一部分,所以“?”是一个很好的分隔符。但我仍然认为使用“?” for 分隔符让生活更轻松(从 url 生成器和解析器的角度来看):

使用乍看不清楚的“&”有什么好处吗?

【问题讨论】:

更进一步可以使用 ?作为键值分隔符:my.html?x?1?y?2?z?3。这可能暗示了为什么使用不同的分隔符,因为它们分隔不同类型的参数。 ?分隔 URL 和查询字符串,& 分隔参数,= 分隔键和值。 【参考方案1】:

从 URI 规范 (RFC 3986) 的角度来看,这里唯一的分隔符是“?”。查询的格式不透明; & 符号恰好是 HTML 用于表单提交的东西。

【讨论】:

那么它们是在不同时期发展的? HTML 是否在 URI 之前存在? 是的,他们是分开开发的,但是不,在 URI(以前称为 URL)之前没有 HTML。 所以答案可能类似于“HTML 和 URI 分别开发,HTML 开发人员没有注意到使用 ? 作为参数分隔符而不是 &”的好处,除非我会说“没有注意到”不准确。他们可能有充分的理由。 “只是 HTML 碰巧用于表单提交的东西”,而是使用它们的 HTTP(数据请求/数据传输协议):tools.ietf.org/html/rfc2616#section-3.2.2 @DavidTonhofer - 不; HTTP 规范根本没有定义查询部分的结构。【参考方案2】:

答案就在这篇文章中 - http://www.skorks.com/2010/05/what-every-developer-should-know-about-urls/ 。为了突出它,这里是:

查询是将一些参数发送到资源的首选方式 服务器。这些是键=值对,与其他对分开 的 URL 由 ? (问号)字符,通常是分开的 由 & (与号)字符相互连接。你可能不知道的是 将它们彼此分开是合法的事实; (分号)字符也是如此。以下 URL 是等效的:

http://www.blah.com/some/crazy/path.html?param1=foo&param2=bar

http://www.blah.com/some/crazy/path.html?param1=foo;param2

【讨论】:

那篇文章只解释了什么而不是为什么。【参考方案3】:

RFC 3896 (https://www.ietf.org/rfc/rfc3986.txt) 定义了通用和子分隔符...'?'是通用的,'&' 和 ';'是子。规范对此非常清楚。

在这种情况下是后者'?'字符将被视为查询的一部分。如果查询解析器严格遵循规范,它会将整个查询传递到应用程序目标。如果应用程序目标可以选择以处理 ?作为参数名称-值对分隔符,这取决于应用程序的设计者。

我的猜测是,这通常“正常工作”,因为拆分查询字符串和原始 uri 的代码使用所有分隔符进行匹配:1)第一个查询在“?”上拆分然后 2) 使用包含 '?' 的字符匹配列表解析查询字符串(仅为方便起见)....这可能已经在无处不在的解析库中发生了。

【讨论】:

以上是关于URL中的参数分隔符,误用问号的情况的主要内容,如果未能解决你的问题,请参考以下文章

Url的参数转变成json

URL 中的问号是查询字符串的一部分吗?

url转义

python url解析

使用转义字符输出正确的网址

url特殊字符转义及解决方法