【问题标题】:Http response with no http header没有 http 标头的 Http 响应
【发布时间】:2012-11-20 23:08:08
【问题描述】:

我已经编写了一个极简的 http 服务器原型(深受 boost asio 示例的启发),目前我还没有在服务器响应中放置任何 http 标头,只有 html 字符串内容。令人惊讶的是它工作得很好。

In that question OP 想知道 http 响应中的必要字段,其中一个 cmets 表示它们在服务器端可能并不重要。

我暂时还没有尝试响应二进制图像文件或 gzip 压缩文件,在这种情况下,我认为必须有一个 http 标头。

但是对于纯文本响应(html、css 和 xml 输出),是否可以从不在我的服务器响应中包含 http 标头?可能存在哪些风险/错误?

【问题讨论】:

    标签: http http-headers


    【解决方案1】:

    至少,您必须提供带有状态行和日期的标题。

    作为一个写过很多协议解析器的人,我求求你,在我的数字隐喻膝盖上,拜托哦拜托哦,请不要仅仅因为你最喜欢的浏览器允许你就完全忽略规范摆脱它。

    只要生成的数据是正确的,就可以创建一个功能最少的程序。这不应该是一个主要的负担,因为您所要做的就是在响应的开头添加三行。其中一行是空白!请花几分钟时间编写两行出色的代码,这将使您的响应数据符合规范。

    您真正应该提供的标题是:

    • 状态行(必填)
    • 日期标题(必需)
    • 内容类型(强烈推荐)
    • content-length(强烈推荐),除非您使用分块编码
    • 如果您要返回 HTTP/1.1 状态行,并且您没有提供有效的内容长度或使用分块编码,则将 Connection: close 添加到您的标头中
    • 将标题与正文分开的空白行(必需)

    您可以选择不随响应发送内容类型,但您必须了解客户端可能不知道如何处理数据。客户端必须猜测它是什么类型的数据。浏览器可能决定将其视为下载文件而不是显示它。自动化过程(某人的 bash/curl 脚本)可能会合理地确定数据不是预期的类型,因此应该将其丢弃。

    来自HTTP/1.1 Specification 3.1.1.5 节。内容类型:

    生成包含有效负载正文的消息的发送者应该 在该消息中生成一个 Content-Type 标头字段,除非 所附表示的预期媒体类型是未知的 发件人。如果 Content-Type 标头字段不存在,则收件人 可以假设媒体类型为“application/octet-stream” ([RFC2046],第 4.5.1 节)或检查数据以确定其类型。

    【讨论】:

    • 你赢了,我目前正在编写小方法来将标题添加到我的输出中。
    • 指定标题的元标记是否也能正常工作?我的意思是客户会自动理解吗?还是我必须通过元标记手动检查标题是否存在?
    • 任何标准的桌面/移动客户端都应该理解 HTML 中的元标记。但是,如果您的数据将被其他类型的软件使用,您就不能依赖功能齐全的 HTML 实现。
    • 根据我对 RFC 2616 规范的理解,日期不是严格要求的,如果您查看第 14.18 节(日期标题)tools.ietf.org/html/rfc2616#section-14.18 它说:“如果服务器没有时钟可以提供当前时间的合理近似值,其响应不得包含 Date 头字段。在这种情况下,必须遵循第 14.18.1 节中的规则。这适用于没有 RTC 的 IoT 设备(从外部服务器查询日期会很复杂)
    猜你喜欢
    • 2021-09-23
    • 2012-04-25
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多