HTTP 消息的 header 字段:谁选择了它们?
the header fields of an HTTP message: who chooses them?
查看 google chrome 的开发者工具中的网络面板,我可以读取网页中每个文件的 HTTP 请求和响应消息,特别是,我可以读取起始行和 header 及其所有字段。
我知道(我希望这是对的)每个 HTTP 消息的起始行都有特定和严格的结构(当然请求和响应消息不同)并且起始行内的任何元素都不能丢失.
与起始行不同,HTTP 消息的 header 包含附加信息,因此,我猜,header 字段是兼性的,或者至少不像字段那样严格要求在起跑线上。
考虑到所有这些,我想知道:谁在 HTTP 消息中设置 header 字段?或者,换句话说,如何确定 HTTP 消息的 header 字段?
比如我实际看到一个网页的HTTP请求报文是这样的:
GET / HTTP/1.1
Host: www.corriere.it
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2
Cookie: rccsLocalPref=milano%7CMilano%7C015146; rcsLocalPref=milano%7CMilano; _chartbeat2=DVgclLD1BW8iBl8sAi.1422913713367.1430683372200.1111111111111111; rlId=8725ab22-cbfc-45f7-a737-7c788ad27371; __ric=5334%3ASat%20Jun%2006%202015%2014%3A13%3A31%20GMT+0200%20%28ora%20legale%20Europa%20occidentale%29%7C; optimizelyEndUserId=oeu1433680191192r0.8780217287130654; optimizelySegments=%7B%222207780387%22%3A%22gc%22%2C%222230660652%22%3A%22false%22%2C%222231370123%22%3A%22referral%22%7D; optimizelyBuckets=%7B%7D; __gads=ID=bbe86fc4200ddae2:T=1434976116:S=ALNI_MZnWxlEim1DkFzJn-vDIvTxMXSJ0g; fbm_203568503078644=base_domain=.corriere.it; apw_browser=3671792671815076067.; channel=Direct; apw_cache=1438466400.TgwTeVxF.1437740670.0.0.0...EgjHfb6VZ2K4uRK4LT619Zau06UsXnMdig-EXKOVhvw; ReadSpeakerSettings=enlarge=enlargeoff; _ga=GA1.2.1780902850.1422986273; __utma=226919106.1780902850.1422986273.1439110897.1439114180.19; __utmc=226919106; __utmz=226919106.1439114180.19.18.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); s_cm_COR=Googlewww.google.it; gvsC=New; rcsddfglr=1441375682.3.2.m0i10Mw-|z1h7I0wH.3671792671815076067..J3ouwyCkNXBCyau35GWCru0I1mfcA3hRLNURnDWREPs; cpmt_xa=5334,5364; utag_main=v_id:014ed4175b8e000f4d2bb480bdd10606d001706500bd0$_sn:74$_ss:1$_st:1439133960323$_pn:1%3Bexp-session$ses_id:1439132160323%3Bexp-session; testcookie=true; s_cc=true; s_nr=1439132160762-Repeat; SC_LNK_CR=%5B%5BB%5D%5D; s_sq=%5B%5BB%5D%5D; dtLatC=116p80.5p169.5p91.5p76.5p130.5p74p246.5p100p74.5p122.5; dtCookie=E4365758C13B82EE9C1C69A59B6F077E|Corriere|1|_default|1; dtPC=-; NSC_Wjq_Dpssjfsf_Dbdif=ffffffff091a1f8d45525d5f4f58455e445a4a423660; hz_amChecked=1
如何选择这些 header 字段? Who/what选了他们? (浏览器?当然不是我...)
p.s.:
希望我的问题很清楚,请原谅我糟糕的英语
所有互联网网站都托管在 HTTP servers 上,这些 headers 由托管网页的 http 服务器设置。它们用于控制页面的显示、缓存和编码方式。
Web 浏览器在从服务器请求页面时设置 headers。这个相互通信协议就是上面链接的HTTP协议。
here is a list of all the possible header fields for a request message: the question is, why the broser chooses only some of them?
浏览器不会在每个请求中包含所有可能的请求 headers,因为:
- 它们不适用于当前请求或
- 默认值为想要的值
例如:
Accept
告诉服务器只有特定的数据格式在响应中是可接受的。如果可以接受任何类型的数据,则可以将其省略,因为默认值为 "everything"。
Content-Length
描述了请求的body的长度。 GET请求没有body,所以没有什么可以描述的长度。
Cookie
包含服务器(或 JavaScript)根据先前请求设置的 cookie。如果没有设置 cookie,则没有一个可以发送回服务器。
等等。
查看 google chrome 的开发者工具中的网络面板,我可以读取网页中每个文件的 HTTP 请求和响应消息,特别是,我可以读取起始行和 header 及其所有字段。
我知道(我希望这是对的)每个 HTTP 消息的起始行都有特定和严格的结构(当然请求和响应消息不同)并且起始行内的任何元素都不能丢失.
与起始行不同,HTTP 消息的 header 包含附加信息,因此,我猜,header 字段是兼性的,或者至少不像字段那样严格要求在起跑线上。
考虑到所有这些,我想知道:谁在 HTTP 消息中设置 header 字段?或者,换句话说,如何确定 HTTP 消息的 header 字段?
比如我实际看到一个网页的HTTP请求报文是这样的:
GET / HTTP/1.1
Host: www.corriere.it
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4,de;q=0.2
Cookie: rccsLocalPref=milano%7CMilano%7C015146; rcsLocalPref=milano%7CMilano; _chartbeat2=DVgclLD1BW8iBl8sAi.1422913713367.1430683372200.1111111111111111; rlId=8725ab22-cbfc-45f7-a737-7c788ad27371; __ric=5334%3ASat%20Jun%2006%202015%2014%3A13%3A31%20GMT+0200%20%28ora%20legale%20Europa%20occidentale%29%7C; optimizelyEndUserId=oeu1433680191192r0.8780217287130654; optimizelySegments=%7B%222207780387%22%3A%22gc%22%2C%222230660652%22%3A%22false%22%2C%222231370123%22%3A%22referral%22%7D; optimizelyBuckets=%7B%7D; __gads=ID=bbe86fc4200ddae2:T=1434976116:S=ALNI_MZnWxlEim1DkFzJn-vDIvTxMXSJ0g; fbm_203568503078644=base_domain=.corriere.it; apw_browser=3671792671815076067.; channel=Direct; apw_cache=1438466400.TgwTeVxF.1437740670.0.0.0...EgjHfb6VZ2K4uRK4LT619Zau06UsXnMdig-EXKOVhvw; ReadSpeakerSettings=enlarge=enlargeoff; _ga=GA1.2.1780902850.1422986273; __utma=226919106.1780902850.1422986273.1439110897.1439114180.19; __utmc=226919106; __utmz=226919106.1439114180.19.18.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); s_cm_COR=Googlewww.google.it; gvsC=New; rcsddfglr=1441375682.3.2.m0i10Mw-|z1h7I0wH.3671792671815076067..J3ouwyCkNXBCyau35GWCru0I1mfcA3hRLNURnDWREPs; cpmt_xa=5334,5364; utag_main=v_id:014ed4175b8e000f4d2bb480bdd10606d001706500bd0$_sn:74$_ss:1$_st:1439133960323$_pn:1%3Bexp-session$ses_id:1439132160323%3Bexp-session; testcookie=true; s_cc=true; s_nr=1439132160762-Repeat; SC_LNK_CR=%5B%5BB%5D%5D; s_sq=%5B%5BB%5D%5D; dtLatC=116p80.5p169.5p91.5p76.5p130.5p74p246.5p100p74.5p122.5; dtCookie=E4365758C13B82EE9C1C69A59B6F077E|Corriere|1|_default|1; dtPC=-; NSC_Wjq_Dpssjfsf_Dbdif=ffffffff091a1f8d45525d5f4f58455e445a4a423660; hz_amChecked=1
如何选择这些 header 字段? Who/what选了他们? (浏览器?当然不是我...)
p.s.: 希望我的问题很清楚,请原谅我糟糕的英语
所有互联网网站都托管在 HTTP servers 上,这些 headers 由托管网页的 http 服务器设置。它们用于控制页面的显示、缓存和编码方式。
Web 浏览器在从服务器请求页面时设置 headers。这个相互通信协议就是上面链接的HTTP协议。
here is a list of all the possible header fields for a request message: the question is, why the broser chooses only some of them?
浏览器不会在每个请求中包含所有可能的请求 headers,因为:
- 它们不适用于当前请求或
- 默认值为想要的值
例如:
Accept
告诉服务器只有特定的数据格式在响应中是可接受的。如果可以接受任何类型的数据,则可以将其省略,因为默认值为 "everything"。
Content-Length
描述了请求的body的长度。 GET请求没有body,所以没有什么可以描述的长度。
Cookie
包含服务器(或 JavaScript)根据先前请求设置的 cookie。如果没有设置 cookie,则没有一个可以发送回服务器。
等等。