HTTP增强的ABNF:#symbol的规范性参考 上下文问题

问题描述

上下文

解决CORS问题,我想知道HTTP响应标头Access-Control-Allow-Headers的有效值是什么。

Whatwg CORS spec on header syntax在ABNF中告诉我:

Access-Control-Allow-Headers = #field-name

RFC7230告诉我:

field-name     = token
token = 1*tchar
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA

此外,Whatwg states表示:

ABNF表示ABNF由HTTP(特别是附加号#)和RFC 7405增强。[RFC7405]

好的,我现在知道此响应头无效:

Access-Control-Allow-Headers: Origin,Content-Type,content type,Accept,Authorization

field-name不应包含空格,但这引出了我的问题:

问题

whatwg ABNF中#symbol的规范性引用在哪里?不是RFC5234定义ABNF语法。我认为这有点像逗号分隔的字段,但是我没有找到真正的参考。

PS:问题不是“ Access-Control-Allow-Headers的有效值是什么”

解决方法

“由HTTP增强(特别是附加的#)” 来自RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing section 7. ABNF List Extension: #rule

[RFC5234]的ABNF规则的#rule扩展用于改进 某些标头字段值的定义中的可读性。

定义了类似于“ *”的构造“#”,用于定义 以逗号分隔的元素列表。完整格式为“ {<n>#<m>element” 指示至少<n>和至多<m>个元素,每个元素之间用一个 单个逗号(“,”)和可选的空格(OWS)。

在任何使用列表构造的产品中,发件人不得 生成空列表元素。换句话说,发件人必须生成 满足以下语法的列表:

1#element =>元素*(OWS“,” OWS元素)

(...)

所以#field-name变成“零个或多个field-name(用逗号分隔并用可选的线性空白包围)”,因为n和m分别默认为0和无穷大。