http - 由 HTTP 增强的 ABNF:#symbol 的规范性参考
问题描述
语境
解决一个CORS
问题,我想知道 HTTP 响应标头的有效值是什么Access-Control-Allow-Headers
。
Whatwg CORS 标头语法规范在 ABNF 中告诉我:
Access-Control-Allow-Headers = #field-name
RFC7230告诉我:
field-name = token
token = 1*tchar
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
此外,Whatwg 指出:
ABNF 表示 ABNF 由 HTTP(特别是添加 #)和 RFC 7405 增强。[RFC7405]
好的,我现在知道这个响应头是无效的:
Access-Control-Allow-Headers: Origin, Content-Type, content type, Accept, Authorization
字段名不应包含空格,但这会导致我的问题:
问题
#symbol
whatwg ABNF的规范参考在哪里?这不是定义 ABNF 语法的RFC5234 。我把它当作逗号分隔的字段,但我没有找到真正的参考。
PS:问题不是“什么是有效值Access-Control-Allow-Headers
”
解决方案
这个“由 HTTP 增强(特别是添加 #)”来自RFC 7230 - 超文本传输协议(HTTP/1.1):消息语法和路由第 7 节。 ABNF 列表扩展:#rule:
[RFC5234] 的 ABNF 规则的#rule 扩展用于提高某些标头字段值定义的可读性。
定义了一个构造“#”,类似于“*”,用于定义以逗号分隔的元素列表。完整的形式是“
<n>#<m>element
”,表示至少<n>
和最多<m>
元素,每个元素由一个逗号(“,”)和可选的空格(OWS)分隔。在任何使用列表构造的产品中,发送者不得生成空列表元素。换句话说,发送者必须生成满足以下语法的列表:
1#元素 => 元素 *( OWS "," OWS 元素)
(...)
所以#field-name
变成“零个或多个field-name
(用逗号分隔并由可选的线性空格包围)”,因为 n 和 m 分别默认为 0 和无穷大。
推荐阅读
- sql - SQL:计算有多少以 a、b 等开头
- angular - 角度:异步 | keyvalue --> 类型“X”上不存在属性“X”
- c - 在 C 中,使用 IF 语句进行错误处理
- flutter - 如何为特定屏幕应用本地化代理,而不是在颤振项目中全部应用?
- javascript - 将数组与字符串进行比较(匹配字符串的一部分)
- css - Quill Editor 颜色基于验证器
- python - 新的 anaconda 环境从我没有安装的包开始
- c# - 异常 System.IO.FileNotFoundException:无法加载文件或程序集
- reactjs - 如何在 webpack5 的 NPM 启动上指定 PORT
- python - 对 python 代码进行故障排除以抓取和存储 PDF 文本