URL 中的问号是查询字符串的一部分吗?
Posted
技术标签:
【中文标题】URL 中的问号是查询字符串的一部分吗?【英文标题】:Is question mark in URL part of query string? 【发布时间】:2016-03-09 23:57:45 【问题描述】:TL;TR:查询的 URL 部分是(第一个)问号还是只是一个分隔符,后跟查询?
RFC 1738,第 3.3 节暗示“?” (问号)不是查询字符串的一部分,只是将它与路径分开:
http://<host>:<port>/<path>?<searchpart>
RFC 3986 附录 A. 中提出的语法,也表示“?”不是实际查询字符串的一部分:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
现在,让我们考虑两个 URL:
http://server.com/api/item.json
http://server.com/api/item.json?
它们是相同的还是不同的?
区分它们并用于识别两种不同的资源是否有效?
【问题讨论】:
“区分它们并用于识别两种不同的资源是否有效?”——即使是,我也不推荐;你永远不知道哪个客户端会倾向于对这样的 URL 执行什么“规范化”。 @CBroe 我赞同你的建议。 【参考方案1】:tl;博士:
?
不是查询组件的一部分。
URI 不等价,因为一个具有 no 查询组件,而另一个具有 空 查询组件。
URI 标准 (STD 66) 目前是 RFC 3986。
6.2. Comparison Ladder 部分描述了如何测试 URI 是否可能等效的方法。
6.2.3. Scheme-Based Normalization 中写道:
规范化不应在关联组件为空时删除分隔符,除非方案规范允许这样做。例如,不能假定 URI
http://example.com/?
等同于上述任何示例。
“上述示例”指的是:
http://example.com http://example.com/ http://example.com:/ http://example.com:80/
(这 4 个 URI 是等价的。)
所以http://example.com/api/item.json
没有查询组件,而http://example.com/api/item.json?
有一个空查询组件。
【讨论】:
以上是关于URL 中的问号是查询字符串的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章