【问题标题】:Content-Type with charset only仅带有字符集的内容类型
【发布时间】:2017-06-19 01:02:04
【问题描述】:

我遇到了这个有趣的标题:

Content-Type: charset=utf-8

Set HTTP header to UTF-8 using PHP

答主说这个语法是RFC 2616定义的,但我不是 在提供的链接中看到它。这是有效的语法吗,如果是,在哪里 具体是这样定义的吗?

【问题讨论】:

    标签: utf-8 http-headers w3c rfc email-headers


    【解决方案1】:

    production in RFC 2616 for the Content-Type header 是这样的:

    Content-Type   = "Content-Type" ":" media-type
    

    the media-type production 是这样的:

    media-type     = type "/" subtype *( ";" parameter )
    type           = token
    subtype        = token
    

    也就是说,虽然参数部分(例如,charset=utf-8 是可选的,但 type "/" subtype 部分不是可选的——也就是说,媒体类型必须有类型后跟斜杠后跟子类型。

    因此,Content-Type: charset=utf-8 不是有效的语法,也没有在其他任何地方以规范/权威的方式特别定义。

    RFC 2616 实际上已被 RFC 7231 和其他几个 RFC(当前的 HTTP RFC)淘汰。

    但是 RFC 7231 的相应部分为这种情况定义了基本相同的产生式:

    production in RFC 7231 for the value of the Content-Type header 是这样的:

    Content-Type = media-type
    

    the media-type production 是这样的:

    media-type = type "/" subtype *( OWS ";" OWS parameter )
    type       = token
    subtype    = token
    

    并且没有其他规范过时或取代该部分 - RFC 7231 在这方面仍然具有权威性。


    大多数编程语言都有很好的媒体类型解析库 语法检查;示例:

    npm install content-type
    node -e "var ct = require('content-type'); ct.parse('charset=utf-8')"
    => TypeError: invalid media type
    node -e "var ct = require('content-type'); ct.parse('image; charset=utf-8')"
    => TypeError: invalid media type
    

    【讨论】:

    • 谢谢。我做了一些测试,虽然类型肯定是必需的,但似乎不需要子类型
    • 你用什么测试的?至少根据 HTTP 规范需要子类型。
    • 我正在使用程序 MHonArc
    • 好的,所以我猜 MHonArc 不需要子类型。但假设其他工具不这样做肯定是不安全的。任何实现符合 RFC 的内容类型解析器的工具都可能无法解析没有子类型的任何内容(例如,请参阅我的答案的编辑)。
    【解决方案2】:

    不,我在 RFC 2616 或 RFC 7231 中的任何地方都找不到此类定义的内容类型。

    而且它甚至不能在 Chrome 中运行。

    (我试过xhr.setRequestHeader('Content-type','charset=utf-8');。当我xhr.send它没有content-type标头。)

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2017-11-25
      • 2013-06-29
      • 2014-05-29
      • 2016-07-25
      相关资源
      最近更新 更多