RFC 3986 中的 HTTP 请求主机值语法
Posted
技术标签:
【中文标题】RFC 3986 中的 HTTP 请求主机值语法【英文标题】:HTTP request host value syntax in RFC 3986 【发布时间】:2020-11-07 08:47:45 【问题描述】:RFC 3986 说主机(我用大写字母写,以区分它作为 HTTP 请求中的参数)值 reg-name
具有 ABNF 语法 reg-name = *( unreserved / pct-encoded / sub-delims )
,其中包括 ie 符号 +
或 !
,其中据我所知,在 URL 权限中是禁止的。标准还指出
由注册名称标识的主机是一个字符序列 通常用于在本地定义的主机或服务中查找 名称注册表,尽管 URI 的特定于方案的语义可能需要 而是使用特定的注册表(或固定名称表)。这 最常见的名称注册机制是域名系统 (DNS)。
并且指的是RFC 1034 section 3.5,其中的语法看起来更像我所期望的。 HTTP主机值中的reg-name
与DNS名称语法有什么关系?使用 HTTP 请求主机值的技术与最常见的技术有哪些不同(据我所知,这只是众多技术之一)?
【问题讨论】:
请提供更多细节。 HTTP (RFC 7230) 中“Host”标头字段的 ABNF 直接引用 RFC 3986 中的“host”ABNF。 @JulianReschke 对。在 RFC 7230 中,第 5.4 节参考了 RFC 3986 中的第 3.2.2 节。这里是“host = IP-literal / IPv4address / reg-name”。搜索“reg-name”会显示问题中提到的 ABNF,但还有一部分我不清楚:如果我正在为 Host 字段值中的地址实现语法解析器,我会在那里看到只有语法看起来像互联网 URL 中的那些,但这个 ABNF 包括 URL 中禁止的符号 - 这只是我的假设。附带说明一下,我可能正在考虑的地址是 DNS 一个 但还有其他使用 Host 字段值的技术,它们有自己的语法(假设也是如此)。我的问题是我是否理解正确,即:主机字段值语法有一般规则,包括 IPv4、IPv6 和 reg-name,更精确的 reg-name 是针对某些地址子集的? (即,我从未见过主机地址 exa(mp)le.org,根据“reg-name”规则,这将是正确的) 【参考方案1】:最初创建 HTTP 时,使用了许多不同的网络技术。所以 HTTP 最初被编写为与传输协议无关。到 1990 年代中期,TCP/IPv4 与互联网上使用的其他协议(如 DNS)一起成为唯一使用的网络技术。因此,HTTP 的开发很可能并非只期望 DNS 提供某种主机名数据库,而且 HTTP 标准可能接受比 DNS 协议更广泛的有效主机名。
实际回答您的问题:可能没有直接关系。但是今天存在一种事实上的关系,即您只会在 Internet 上看到有效的 DNS 名称作为 HTTP 主机名。
【讨论】:
以上是关于RFC 3986 中的 HTTP 请求主机值语法的主要内容,如果未能解决你的问题,请参考以下文章
The valid characters are defined in RFC 7230 and RFC 3986错误解决方式
为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?
Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致
The valid characters are defined in RFC 7230 and RFC 3986
springboot 内置默认启动tomcat容器遇到The valid characters are defined in RFC 7230 and RFC 3986”