http接受和内容类型标头混淆

时间:2016-05-05 21:39:05

标签: http http-headers webserver

这是传输到Web服务器的HTTP请求消息的示例。内部标题中有一个Accept标头。我对它的含义及其创建方式感到困惑。我认为它只是指定我的浏览器处理文件的能力。但这并不能解释为什么我访问amazon.com或joes-hardware时会有所不同。

还有Content-Type标头,它是所请求文件的MIME。同样的问题。我的浏览器如何知道它请求的文件类型是什么?它是基于我请求的URI扩展还是通用标头?此标头似乎只在响应头中发送。我的错误。

GET /tools.html HTTP/1.0
User-agent: Mozilla/4.75 [en] (Win98; U) Host: www.joes-hardware.com
Accept: text/html, image/gif, image/jpeg 
Accept-language: en

1 个答案:

答案 0 :(得分:1)

首先要做的事情:AcceptAccept-Language分别是RFC 7231, section 5.3.2section 5.3.5中定义的标头。它们与Accept-*标头一起,通过客户端启用内容协商。关于Mozilla Development Network的内容引导,​​有一篇很好的文章。 (旁注:MDN是一个很好的研究起点。很多文章已经过时,但概念仍然很有效)

Accept-Language的内容很大程度上取决于客户端用户界面的语言设置。 Mozilla的Firefox(和 - IIRC - Opera和Safari)允许通过其设置调整这些,而MSIE似乎从系统中安装的键盘布局中扣除它们。请求媒体类型中没有任何内容可以影响此标题。

另一方面,Accept标头的内容在很大程度上取决于请求资源的上下文。例如。如果您通过浏览器的地址栏请求资源,Accept标题几乎就像是#34;给我任何我可以消化的内容。&#34;如果浏览器通过<img/> - 标记请求资源,则标题的不同之处在于浏览器正在尝试获取适合在该标记内显示的所请求资源的表示。 <video/><audio/><script/>也是如此。

除此之外,我不知道有任何影响Accept标题的机制。 <a/> - 标签有 - 最不为人知 - 一个type属性,它带有MIME媒体类型。但是,这是一种回退机制,不应以任何方式改变Accept

至于你的例子,我冒昧地请求两个站点并复制相关的请求标题:

amazon.com

GET / HTTP/1.1
Host: www.amazon.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

joes-hardware.com

GET / HTTP/1.1
Host: www.joes-hardware.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

在上一个示例中请求/tools.html时标题没有区别。