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 中的问号是查询字符串的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

asp网站地址中的问号怎么去掉

url中的查询字符串的参数解析

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

如何匹配可以以查询字符串结尾的 url 中的文件扩展名?

URLEncode 中对 空格的编码有 “+”和“%20”两种

一个 URL 中有多个问号是不是有效?