HTTP筆記6HTTP首部

HTTP首部

HTTP報文首部結(jié)構(gòu)

復習一下前邊的知識:
HTTP報文大致可分為報文首部和報文主體兩塊,通常并不一定要有報文主體

請求報文及響應報文的結(jié)構(gòu)


請求報文結(jié)構(gòu)如下:

  • 報文首部
    • 請求行
    • 請求首部字段
    • 通用首部字段
    • 實體首部字段
    • 其他(如Cookie)
  • 空行換行(CR+LF)
  • 報文主體

響應報文結(jié)構(gòu)如下:

  • 報文首部
    • 狀態(tài)行
    • 響應首部字段
    • 通用首部字段
    • 實體首部字段
    • 其他(如Cookie)
  • 空行換行(CR+LF)
  • 報文主體

HTTP首部字段

HTTP首部字段是構(gòu)成HTTP報文的要素之一,它給瀏覽器和服務器提供報文主體大小、所使用的語言篮绿、認證信息等內(nèi)容

HTTP首部字段結(jié)構(gòu)

HTTP首部字段由首部字段名和字段值構(gòu)成,中間用冒號“:”分隔
首部字段名:字段值, 例如:Content-Type:text/html

同一個字段名可以有多個字段值,如:
Keep-Alive:timeout=15, max=100

HTTP首部字段類型

HTTP首部字段根據(jù)實際用途被分為以下4種類型

  • 通用首部字段
  • 請求首部字段
  • 相應首部字段
  • 實體首部字段

HTTP/1.1 首部字段一覽

HTTP/1.1規(guī)范定義了如下47種首部字段






除了這47種七冲,還有Cookie、Set-Cookie和Content-Disposition等其他RFC種定義的首部字段用的比較多

End-to-End首部和Hop-by-hop首部

HTTP首部字段將定義成緩存代理和非緩存代理的行為分成2種:
端到端首部 和 逐跳首部


HTTP/1.1 通用首部字段

Cache-Control

Cache-Control能夠控制緩存的行為规婆,Cache-Control指令一覽

緩存請求指令:

  • max-age(秒):響應的最大age值
  • min-fresh: 期望在指定時間內(nèi)的響應仍有效
  • max-stale:接收已過期的響應
  • no-cache:不接收緩存的數(shù)據(jù)
  • no-store:不緩存任何內(nèi)容
  • no-transform:代理不可更改媒體類型
  • only-if-cached:只從代理的緩存獲取資源
  • cache-extension:新指令標記

緩存響應指令:

  • public:可向任意方提供響應
  • private:僅向特定用戶返回響應
  • no-cache:緩存前必須確認其有效性
  • no-store:不緩存任何內(nèi)容
  • no-transform:代理不可更改媒體類型
  • must-revalidate:可緩存但必須向源服務器進行確認
  • proxy-revalidate:
  • max-age:響應的最大Age值
  • s-maxage:公共緩存服務器響應的最大Age值
  • cache-extension:新指令標記

Connection

Connection首部字段具備如下兩個作用:

  • 管理持久連接
  • 控制不再轉(zhuǎn)發(fā)給代理的首部字段

HTTP/1.1之前版本的默認連接都是非持久連接澜躺,如果要在舊版本的HTTP協(xié)議上維持持續(xù)連接,則需要指定Connection:Keep-Alive
Connection:close表示斷開連接

Date

首部字段Date表明創(chuàng)建報文的日期和時間

Transfer-Encoding

首部字段Transfer-Encoding規(guī)定了傳輸報文主體時采用的編碼方式
HTTP/1.1的傳輸編碼方式僅對分塊傳輸編碼有效

Via

Via記錄了客戶端和服務器之間的請求和響應報文的傳輸路徑

Upgrade

Upgrade用于檢測HTTP協(xié)議及其他協(xié)議是否可使用更高的版本進行通信抒蚜,其參數(shù)值可以用來指定一個完全不同的通信協(xié)議

Trailer

Trailer說明了在報文主體后記錄了哪些首部字段

Warning

該首部通常會告知用戶一些與緩存相關的問題警告


請求首部字段

Host

Host表示資源所處的互聯(lián)網(wǎng)主機名和端口號掘鄙,該字段是HTTP/1.1規(guī)范內(nèi)唯一一個必須被包含在請求內(nèi)的首部字段

Accept

Accetp首部字段可通知服務器,客戶端能夠處理的媒體類型及媒體類型的優(yōu)先級嗡髓,可使用type/subtype這種形式操漠,一次可以指定多種媒體類型

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

舉幾個常見媒體類型的例子:

  • 文本文件
    text/html, text/plain, text/css
    application/xhtml+xml, application/xml
  • 圖片文件
    image/jpeg, image/png, image/gif
  • 視頻文件
    video/mpeg, video/quicktime
  • 應用程序使用的二進制文件
    application/octet-stream, application/zip

q=0.9表示權重,默認值為1.0饿这,且1為最大值浊伙。當服務器提供多種內(nèi)容時,將會首先返回權重高的媒體類型

Accept-Charset

Accept-Charset首部字段可用來通知服務器客戶端支持的字符集及優(yōu)先順序长捧,用q值來表示相對優(yōu)先級

Accept-Charset:iso-8859-5, utf-8;q=0.8

Accept-Encoding

Accept-Encoding用來告知服務器客戶端支持的內(nèi)容編碼及優(yōu)先級順序嚣鄙,可一次性指定多種內(nèi)容編碼,常見的集中編碼格式:

  • gzip
  • compress
  • deflate
  • identity

采用q值來表示優(yōu)先級串结,可使用星號*指定任意格式的編碼格式

Accept-Language

Accept-Language告知服務器客戶端能夠處理的自然語言集哑子,可用q值表示優(yōu)先級

Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3

User-Agent

User-Agent會將客戶端的瀏覽器和其他信息發(fā)送給服務器

Authorization

Authorization用來告知服務器客戶端的認證信息(證書值)


Proxy-Authorization

此認證發(fā)生在客戶端和代理之間

From

客戶端的郵件地址

If-Match

形如If-xxx這種形式的請求首部字段,都可成為條件請求肌割。服務器接收到附帶條件的請求后赵抢,只有判斷指定條件為真時,才會執(zhí)行請求

If-Match的字段值會和服務器端實體標記ETag匹配声功,一致時服務器才會接受請求烦却,反之則返回狀態(tài)碼412 Precondition Failed

If-Modified-Since

if-none-match

與if-match的作用相反,只有在if-none-match字段值與ETag值不一致時才處理該請求
在Get或Head方法中使用if-none-match可獲取最新的資源

If-Range

If-Unmodified-Since

與If-Modified-Since的作用相反

Max-Forwards

Max-Forwards:5
每次轉(zhuǎn)發(fā)數(shù)值減1先巴,當數(shù)值變成0時返回響應其爵。可以避免由于位置原因而導致的請求陷入循環(huán)

Range

Range:bytes=5001-10000
對于只需獲取部分資源的范圍請求伸蚯,包含首部字段Range即可告知服務器資源的指定范圍
接收到Range首部字段請求的服務器摩渺,會在請求之后返回狀態(tài)碼206 Partial Content的響應,無法處理該范圍請求時剂邮,則會返回200 ok的響應及全部資源

Referer

Referer會告知服務器請求的原始資源的URI摇幻,其中可能含有ID和密碼等保密信息,寫進Referer有可能導致泄密

TE

TE:gzip, deflate;q=0,5

TE會告知服務器客戶端能夠處理響應的傳輸編碼方式及優(yōu)先級,而Accept-encoding怎表示內(nèi)容的編碼的方式

還可指定伴隨Trailer字段的分塊傳輸編碼的方式


響應首部字段

Accept-Ranges

Accept-Ranges是用來告知客戶端服務器是否能處理范圍請求绰姻,以指定獲取服務器端某個部分的資源
可指定的字段有兩種枉侧,可處理范圍請求時為bytes,反之為none

Accept-Ranges:bytes

Age

Age:60

Age告知客戶端狂芋,源服務器在多久前創(chuàng)建了響應榨馁,單位是秒

ETag

ETag:"82ec22325w"

ETag是資源的唯一標識,以字符串方式表示帜矾,服務器會為每份資源分配對應的ETag值翼虫。當資源更新時,ETag值也需要更新

強ETag和弱ETag

  • 強ETag
    無論實體發(fā)生多么細微的變化都會改變其值
  • 弱ETag
    只有資源發(fā)生了根本改變屡萤,產(chǎn)生差異時才會改變ETag值珍剑,在字段開始處附加W/ ETag:W/"usagi-1234"

Location

Location可以將響應接收方引導至某個新的URI,基本上死陆,該字段會配合3XX的響應招拙,提供重定向的URI

3xx
Location:http//www.google.cn/hk

Server

Server表示了服務器上安裝的HTTP服務器應用程序的信息

Server: Apache/2.2.6(Unix) PHP/5.2.5

Retry-after

Retry-after: 120(或是日期時間)

告知客戶端應該在多久之后再次發(fā)送請求,配合503 或 3xx一起使用

WWW-Atuthenticate

WWW-Atuthenticate: Basic realm="usagidesign Auth"

WWW-Atuthenticate用于HTTP訪問認證翔曲,它會告知客戶端適用于訪問請求URI的認證方案

Proxy-Atuthenticate

和WWW-Atuthenticate一樣迫像,不過是發(fā)生在客戶端和代理之間

Vary

Vary: Accept-Language

Vary可以控制代理的緩存,只返回Accept-Language值相同的緩存


實體首部字段

Allow

405 Method Not Allowed
Allow: GET, POST

該字段用于通知客戶端能夠支持的Request的HTTP方法瞳遍,當服務器接收到不支持的HTTP方法時闻妓,返回405 Method Not Allowed作為響應,同時將支持的方法寫入Allow返回

Content-Location

與Location不同掠械,Content-Location表示的是報文主體返回資源對應的URI

Content-Encoding

Content-Encoding: gzip

Content-Encoding表示實體主體的編碼方式

Content-Language

Content-Language表示主體使用的自然語言

Content-Length

Content-Length表明了實體主體的大小由缆,單位是字節(jié)。如果主體進行了編碼傳輸猾蒂,則不再使用此字段

Content-MD5

Content-MD5是一串由MD5算法生成的值均唉,其目的在于檢查報文主體在傳輸過程中是否保持完整,以確認傳輸?shù)竭_
對報文主體執(zhí)行MD5算法獲得128位二進制數(shù)肚菠,再通過Base64編碼后將結(jié)果寫入Content-MD5字段舔箭,由于HTTP首部無法記錄二進制值,所以要通過Base64編碼蚊逢。接收方收到后對報文主體再執(zhí)行一次相同的MD5算法层扶,通過比較值來判斷主體的準確性

有被篡改的可能

Content-type

Content-type: text/html; charset=UTF-8

和Accept一樣,Content-type表示了實體主體對象的媒體類型

Content-Range


針對范圍請求烙荷,返回響應時使用Content-Range可以告知客戶端返回的哪個范圍镜会,單位是字節(jié)

Expires

Expires: Wed, 04 Jul 2012 08:26:05 GMT

Expires表示了資源的有效期,如果在有效期內(nèi)终抽,緩存服務器會以緩存來應答請求戳表,如果過了有效期則從源服務器請求資源桶至。
如果不希望緩存服務器對資源緩存時,則將Expires值和Date值設置為相等

當首部字段Cache-Control有指定max-age時匾旭,會優(yōu)先處理max-age

Last-Modified

Last-Modified: Thurs, 30 Jun 2016 18:00:00 GMT

Last-Modified表示資源最終修改的時間


為Cookie服務的首部字段

Set-Cookie

Set-Cookie: status=enable; expires=Thurs, 30 Jun 2016 18:00:00 GMT; path=/; domain=.hackr.jp;

下面是一個Set-Cookie的例子:

Set-Cookie: laravel_session=eyJpdiI6IjJnN1Rwd;
expires=Thu, 30-Jun-2016 12:37:37 GMT;
Max-Age=7200;
path=/;
HttpOnly

Cookie

Cookie: laravel_session=eyJpdiI6IjJnN1Rwd

客戶端接收到的服務器端發(fā)送的Cookie


其他首部字段

  • X-Frame-Options
  • X-XSS-Protection
  • DNT
  • P3P

X-Frame-Options

該字段屬于響應首部镣屹,用于控制網(wǎng)站內(nèi)容在其他web網(wǎng)站的Frame標簽內(nèi)的顯示問題,主要目的是為了防止點擊劫持攻擊
有兩個字段值:

  • DENY
    拒絕
  • SAMEORIGIN
    僅同域名下的頁面匹配時許可

X-XSS-Protextion

X-XSS-Protextion: 1

該字段屬于響應首部季率,踏實針對跨站腳本攻擊(XSS)的一種對策野瘦,用0和1來控制瀏覽器XSS防護機制的開關

P3P

該字段屬于響應首部描沟,通過利用P3P技術飒泻,可以讓web網(wǎng)站上的個人隱私編程一種僅供程序可理解的形式,以達到保護用戶隱私的目的

DNT

DNT: 1

該字段屬于請求首部吏廉,DNT是Do not track的簡稱泞遗,意為拒絕個人信息被收集,用0和1來控制席覆,可以拒絕被精準廣告追蹤


補充說明:

Accept和content-type的區(qū)別史辙,accept表示發(fā)送方(客戶端)希望接收的資源類型,而content-type表示發(fā)送方發(fā)送的資源類型

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佩伤,一起剝皮案震驚了整個濱河市聊倔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌生巡,老刑警劉巖耙蔑,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孤荣,居然都是意外死亡甸陌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門盐股,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钱豁,“玉大人,你說我怎么就攤上這事疯汁∩撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵幌蚊,是天一觀的道長谤碳。 經(jīng)常有香客問我,道長霹肝,這世上最難降的妖魔是什么估蹄? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沫换,結(jié)果婚禮上臭蚁,老公的妹妹穿的比我還像新娘最铁。我一直安慰自己,他們只是感情好垮兑,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布冷尉。 她就那樣靜靜地躺著,像睡著了一般系枪。 火紅的嫁衣襯著肌膚如雪雀哨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天私爷,我揣著相機與錄音雾棺,去河邊找鬼。 笑死衬浑,一個胖子當著我的面吹牛捌浩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播工秩,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸饺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了助币?” 一聲冷哼從身側(cè)響起浪听,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眉菱,沒想到半個月后迹栓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡倍谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年迈螟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔崔。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡答毫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季春,到底是詐尸還是另有隱情洗搂,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布载弄,位于F島的核電站耘拇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宇攻。R本人自食惡果不足惜惫叛,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逞刷。 院中可真熱鬧嘉涌,春花似錦妻熊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至警医,卻和暖如春亿胸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背预皇。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工侈玄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人深啤。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓拗馒,卻偏偏與公主長得像路星,于是被迫代替她去往敵國和親溯街。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容