http accept 和 content-type headers 混淆

http accept and content-type headers confusion

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

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

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

首先要注意的是:AcceptAccept-Language是在RFC 7231, section 5.3.2 and section 5.3.5, respectively. Together with Accept-* headers, they enable content negotiation through the client. There is an excellent article regarding content engotiation on the Mozilla Development Network中定义的header。 (论side-note:MDN 是一个极好的研究起点。很多文章已经过时,但概念在很大程度上仍然有效)

Accept-Language 的内容主要受客户端 UI 的语言设置控制。 Mozilla 的 Firefox(以及 - IIRC - Opera 和 Safari)允许通过其设置调整这些,而 MSIE 似乎从系统中安装的键盘布局中扣除它们。请求的媒体类型中没有任何内容会影响此 header。

另一方面,Accept header 的内容在很大程度上取决于请求资源的上下文。例如。如果您通过浏览器的地址栏请求资源,Accept header 读起来就像“给我任何我能消化的东西”。如果浏览器通过 <img/> 标签请求资源,则 header 将有所不同,因为浏览器正在尝试获取适合在该标签内显示的所请求资源的表示. <video/><audio/><script/>.

相同

除此之外,我不知道有任何影响 Accept header 的机制。 <a/>-tags 有一个 - 大多数人不知道的 - type 属性,它携带一个 MIME 媒体类型。但是,这是一种后备机制,不应以任何方式改变 Accept

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

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 时 header 没有什么不同。