HTTP系列——首部字段

HTTP協議——HTTP通用首部(經常使用)

通用首部字段名

通用首部字段名 說明
Cache-Control 控制緩存的行爲
Connection 容許客戶單和服務器指定與請求/響應連接有關的選項
Date 建立報文的日期時間

Cache-Control

Cache-Control請求指令:
指令 參數 說明
no-cache 強制向源服務器再次驗證
no-store 規定緩存不能在本地存儲請求的任一部分
max-age=[秒] 必須 好比max-age=31536000,緩存一年
Cache-Control緩存響應指令:
指令 說明
public 可向任意方提供響應的緩存
private 僅向特定用戶返回響應
no-cache 緩存前必須先確認其有效性
no-store 規定緩存不能在本地存儲響應的任一部分
max-age=[秒] 響應的最大Age值
補充

no-cache:並不意味着不緩存。它的意思是在使用緩存資源以前,它必須通過服務器的檢查(revalidate也能夠實現這個功能)。
no-store:纔是告訴瀏覽器不要緩存它。
max-age
資源的內容很是穩定,長時間內都不會發生變動,那麼咱們就能夠聲明瀏覽器/CDN能夠長時間緩存該資源(31536000秒,即一年),只要用戶不手動清理瀏覽器緩存,一年內源服務器都再也不會收到(當前瀏覽器/CDN)對該資源的請求。
推薦前端靜態資源緩存最優解以及max-age的陷阱html

Connection

字段 說明
keep-alive 維持長連接
close 關閉連接
keep-alive說明補充

Connection: Keep-Alive 是用於 HTTP持久鏈接 的字段。前端

close模式和keep-alive模式的請求對比:算法

image

Keep-Alive的優缺

優勢:keep-alive 模式更加高效,由於避免了鏈接創建和釋放的開銷
缺點:長時間的 tcp 鏈接容易致使系統資源無效佔用,浪費系統資源瀏覽器

HTTP協議——HTTP請求首部(經常使用)

請求首部字段名

請求首部字段名 說明
Host 給出了接收請求的服務器的主機名和端口號
Referer 提供了包含當前請求URL的文檔的URL
User-Agent 將發起請求的應用程序名稱告知服務器
Accept 服務器能夠處理的內容類型(MIME_type)
Accept-Encoding 編碼方式(gzip:LZ77壓縮算法;compress:LZW 壓縮算法;identity:自身)
If-Modified-Since 搭配Last-Modified實現協商緩存
If-None-Match 搭配ETag實現緩存
Authorization 用戶憑證;好比(Bearer xxxx)
Cookie 瀏覽器每次發送請求都會攜帶

Referer

我在www.google.com 裏有一個www.baidu.com 連接,那麼點擊這個www.baidu.com ,它的header 信息裏就有:緩存

Referer=http://www.google.com
Referer的做用:
  • 防盜鏈

我只容許我本身的網站訪問我本身的圖片服務器,那個人域名是www.google.com,那麼圖片服務器每次取到Referer來判斷一下是否是我本身的域名www.google.com,若是是就繼續訪問,不是就攔截。服務器

  • 防止惡意請求。

動態請求是時候,必須 Referer 爲我本身的網站。cookie

Accept

請求頭用來告知(服務器)客戶端能夠處理的內容類型,這種內容類型用MIME類型來表示。服務器能夠從諸多備選項中選擇一項進行應用,並使用Content-Type應答頭通知客戶端它的選擇。app

Accept字段
Accept字段 信息
<MIME_type>/<MIME_subtype> 單一精確的 MIME 類型, 例如text/html.
<MIME_type>/* 一類 MIME 類型, 可是沒有指明子類。 image/* 能夠用來指代 image/png, image/svg, image/gif 以及任何其餘的圖片類型。
*/* 任意類型的 MIME 類型
;q= (q因子權重) 值表明優先順序,用相對質量價值表示,又稱做權重。
Accept: text/html

Accept: image/*

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

HTTP協議——HTTP響應首部(經常使用)

響應首部字段名

字段 信息
Age 我也沒弄懂,幹啥的
Server 服務器應用程序軟件的名稱和版本
Vary 決定了對於將來的一個請求頭
Set-Cookie 服務器端向客戶端發送 cookie

Vary

Vary實現動態服務

Vary: User-Agent
例如你提供給移動端的內容是不一樣的,可用防止你客戶端誤使用了用於桌面端的緩存。 並可幫助Google和其餘搜索引擎來發現你的移動端版本的頁面,同時告知他們不須要Cloaking。tcp

Vary: Accept-Encoding不一樣的客戶端壓縮編碼的方式可能不一樣,可能有的客戶端不支持壓縮,那麼服務器端返回的數據就不能壓縮,須要服務器端作不一樣的數據返回。對於這個問題的解決經過添加Vary的Accept-Encoding告訴服務器支持的類型,來返回特定數據ide

HTTP協議——HTTP實體首部(經常使用)

實體首部字段名

實體首部字段 信息
Allow 枚舉資源所支持的 HTTP 方法的集合
Content-Encoding 對主體執行的任意編碼方式
Content-Length 主體的長度或者尺寸
Content-Type 這個主體的對象類型
ETag 與此實體相關的實體標記
Last-Modified 這個實體最後一次被修改的日期和時間

Allow

當服務器接收到不支持的 HTTP 方法時,會以狀態碼405 Method Not Allowed 做爲響應返回。與此同時,還會把全部能支持的 HTTP 方法寫入首部字段 Allow 後返回。

Expires

緩存過時時間,用來指定資源到期的時間,是服務器端的具體的時間點。

Expires是Web服務器響應消息頭字段,在響應http請求時告訴瀏覽器在過時時間前瀏覽器能夠直接從瀏覽器緩存取數據,而無需再次請求。

Expires: Wed, 04 Jul 2012 08:26:05 GMT
#經過HTTP的META設置expires和cache-control
<meta http-equiv="Expires"  content="Wed, 04 Jul 2012 08:26:05 GMT">//僅對該網頁有效,對網頁中的圖片或其餘請求無效
ps

若是在Cache-Control響應頭設置了 "max-age" 或者 "s-max-age" 指令,那麼 Expires 頭會被忽略

Expires 是 HTTP/1 的產物,受限於本地時間,若是修改了本地時間,可能會形成緩存失效。

補充

Content-Encoding和Content-Type及服務器和客戶端處理流程

# Response Headers(響應頭部)
Content-Encoding: gzip
Content-Type:text/plain;charset=iso-8859-1

以返回hello信息爲例:
服務端瀏覽器發送了一條信息:hello
首先,服務端要告訴瀏覽器,我給你發的這條數據的類型,不一樣類型的數據,接收方的處理方式不同則須要設置Content-Type:text/plain;charset=iso-8859-1告訴瀏覽器怎麼處理;

由於計算機只知道0和1,這時候瀏覽器收到的應該是:
01101000(h) 01100101(e) 01101100(l) 01101100(l) 01101111(o)

若是咱們對'hello'進行gzip算法壓縮;那麼二進制串已經發生了改變;因此咱們還須要告訴瀏覽器Content-Encoding: gzip

服務器-->Content-Type:text/plain和Content-Encoding:gzip
-->瀏覽器-->先解析壓縮算法Content-Encoding:gzip-->
先解析壓縮算法Content-Encoding:gzip-->後解析Content-Type

Last-Modified和If-Modified-Since的關係

瀏覽器在第一次訪問資源時,服務器返回資源的同時,在Response Headers中添加 Last-Modified,值是這個資源在服務器上的最後修改時間:

Last-Modified: Fri, 23 Oct 2020 07:33:48 GMT

瀏覽器再次請求該資源,則Request Headers添加

If-Modified-Since: Fri, 23 Oct 2020 07:33:48 GMT

服務器再次收到這個資源請求,會根據If-Modified-Since值與服務器中這個資源的最後修改時間對比。若是沒有變化,返回304和空的響應體,直接從緩存讀取;若是If-Modified-Since的時間小於服務器中這個資源的最後修改時間,說明文件有更新,因而返回新的資源文件和200;

ETag和If-None-Match

瀏覽器在第一次訪問資源時,服務器返回資源的同時當前資源文件的一個惟一標識在Response Headers中添加 ETag(只要資源有變化,Etag就會從新生成):

ETag: "5f92875c-6fa"

瀏覽器再次請求該資源,則Request Headers添加

If-None-Match: "5f92875c-6fa"

服務器只須要比較客戶端傳來的If-None-Match跟本身服務器上該資源的ETag是否一致,就能很好地判斷資源相對客戶端而言是否被修改過了

MIME 類型

MDN MIME 類型

相關博文

https 加密、http2.0、keep-alive

Accept

http的Content-Encoding和Content-Type及服務器和客戶端處理流程

瀏覽器緩存機制

相關文章
相關標籤/搜索