HTTP Header 值允许的字符
HTTP Header value allowed characters
我已经检查了 RFC 中的 HTTP header 值允许字符。我无法理解整个事情,请描述更多。 RFC 参考 https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
field-value = *( field-content / obs-fold )
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar = VCHAR / obs-text
obs-fold = CRLF 1*( SP / HTAB )
; obsolete line folding
; see Section 3.2.4
阅读这些 RFC 中的 Augment BNF 语法需要一些时间来适应,但让我们逐步了解它:
field-value = *( field-content / obs-fold )
这表示一个值可以包含任意数量的 field-content
或任意数量的 obs-fold
(续行 - 我们稍后会讲到)。
field-content
定义为:
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
这是一个 field-vchar
,可以选择后跟一个或多个 space 或制表符,然后是 field-vchar
.
接下来我会剧透并告诉你 field-vchar
基本上是任何可见的文本字符(即不包括 space、制表符、换行符或控制字符)。所以上面告诉你的是,它基本上是任何可见字符,但也可以包括 space 和制表符,但不能在开头或结尾。
field-vchar
定义为:
field-vchar = VCHAR / obs-text
这是一个 VCHAR
(在 RFC 中进一步定义为“任何可见的 [USASCII] 字符”)或 obs-text
(%x80-FF 范围内的字符 - 基本上是额外的可打印字符的基本 ASCII 字符)。
然后我们一直回到定义最后一项的第一个语句:obs-fold
我们得到:
obs-fold = CRLF 1*( SP / HTAB )
; obsolete line folding
; see Section 3.2.4
基本上是一个换行符后跟一个或多个 space 或制表符。这是将 header 拆分为多行以提高可读性的历史方法(尽管换行符和白色 space 被有效地忽略并被视为 space 所以它不是换行符) .对此的支持总是有点古怪,许多 HTTP 处理器假设 headers 中不会有换行符(即使在技术上是允许的)。强烈建议不要使用它,特别是因为它现在已被正式弃用。 (请注意,某些服务器 - for example Apache - 允许在其配置中添加新行以提高可读性,但不发送这些新行,因此这是一个单独的项目)。
综上所述,字段值基本上可以包含任何可见字符,包括制表符或 spaces(但不能以这些字符开头或结尾)。它们不能包含换行符或任何其他 non-visible 字符(即 ASCII 字符 0-31 - 除了讨论的制表符 - 或 127)。
我已经检查了 RFC 中的 HTTP header 值允许字符。我无法理解整个事情,请描述更多。 RFC 参考 https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
field-value = *( field-content / obs-fold )
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar = VCHAR / obs-text
obs-fold = CRLF 1*( SP / HTAB )
; obsolete line folding
; see Section 3.2.4
阅读这些 RFC 中的 Augment BNF 语法需要一些时间来适应,但让我们逐步了解它:
field-value = *( field-content / obs-fold )
这表示一个值可以包含任意数量的 field-content
或任意数量的 obs-fold
(续行 - 我们稍后会讲到)。
field-content
定义为:
field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
这是一个 field-vchar
,可以选择后跟一个或多个 space 或制表符,然后是 field-vchar
.
接下来我会剧透并告诉你 field-vchar
基本上是任何可见的文本字符(即不包括 space、制表符、换行符或控制字符)。所以上面告诉你的是,它基本上是任何可见字符,但也可以包括 space 和制表符,但不能在开头或结尾。
field-vchar
定义为:
field-vchar = VCHAR / obs-text
这是一个 VCHAR
(在 RFC 中进一步定义为“任何可见的 [USASCII] 字符”)或 obs-text
(%x80-FF 范围内的字符 - 基本上是额外的可打印字符的基本 ASCII 字符)。
然后我们一直回到定义最后一项的第一个语句:obs-fold
我们得到:
obs-fold = CRLF 1*( SP / HTAB ) ; obsolete line folding ; see Section 3.2.4
基本上是一个换行符后跟一个或多个 space 或制表符。这是将 header 拆分为多行以提高可读性的历史方法(尽管换行符和白色 space 被有效地忽略并被视为 space 所以它不是换行符) .对此的支持总是有点古怪,许多 HTTP 处理器假设 headers 中不会有换行符(即使在技术上是允许的)。强烈建议不要使用它,特别是因为它现在已被正式弃用。 (请注意,某些服务器 - for example Apache - 允许在其配置中添加新行以提高可读性,但不发送这些新行,因此这是一个单独的项目)。
综上所述,字段值基本上可以包含任何可见字符,包括制表符或 spaces(但不能以这些字符开头或结尾)。它们不能包含换行符或任何其他 non-visible 字符(即 ASCII 字符 0-31 - 除了讨论的制表符 - 或 127)。