HTTP 中的标头接受

问题描述 投票:0回答:4

我在 http 中遇到“Accept”标头的问题。我写了一个http客户端,当我设置“接受:image/png”时,我仍然可以读取任何文件(如txt、html等)。 我认为当像上面那样设置标题“Accept”时,这是不可能的。

我尝试检查我的 Firefox 的行为方式。我写了“about:config”并将“network.http.accept.default”设置为“image/png”,我就可以像平常一样上网了。

我是否误解了这个标题的含义?我认为我应该只能打开文件 *.png。

http network-programming http-headers protocols
4个回答
6
投票

接受不是强制性的;服务器可以(而且经常)要么不实现它,要么决定返回其他内容。

如果请求中存在 [Accept] 标头字段,并且响应的可用表示均不具有被列为可接受的媒体类型,则源服务器可以通过发送 406(不可接受)响应来尊重标头字段或者通过将响应视为不受内容协商来忽略标头字段。

来源 - RFC 7231 5.3.2。接受

新规范还规定:

用户代理不能依赖一致遵守的主动协商首选项,因为源服务器可能不会对所请求的资源实现主动协商,或者可能决定发送不符合用户代理首选项的响应比发送 406 更好(不可接受)回应。

来源 - RFC 9110 12.1 主动协商


1
投票

其实,前一种行为很正常。让我给你举个例子。

如果给定的 URL 指向 PDF 文件并且 Accept 标头仅接受 docx,则服务器将盲目地忽略它并发送 PDF 文件,因为服务器未设置为在 PDF 和其他文档之间做出决定。

如果有多种可用格式,则服务器将考虑“Accept”标头并尝试相应地发送响应,如果没有,则它将忽略“Accept”标头。


0
投票

正如您所想,设置 Accept 意味着您不能接受指定媒体之外的其他媒体,并且服务器应返回 406 响应代码。 实践中,服务器无法正确实现,并且总是发送响应。

所有详细信息均可在 RFC 2616

中找到

0
投票

浏览器对接受标头的实现很差,并且在爬虫也发出请求的公共网站上使用时会导致奇怪的错误。

这就是为什么,像在 Rail 框架 中一样,大多数情况下都会忽略接受标头。

© www.soinside.com 2019 - 2024. All rights reserved.