HTTP 1.0
在HTTP1.0中,可以在服務端設置 Expires 的HTTP頭來告訴客戶端在多久之后重新請求服務,可以通過 if-modified-since 的條件請求來使用緩存,其中發(fā)送時間是文件最初被下載的時間,而不是過期時間。如果文件沒有改變,服務器可以響應 304-Not Modified 表示文件未改變,客戶端可以繼續(xù)使用緩存的文件。
HTTP1.0中服務器在返回時,可以通過在響應頭中添加 Last-Modified 的方式表示資源上一次更改時間。請求時傳遞的if-modified-since值就是Last-Modified的值。但是這個時間僅僅只能代表編輯時間,如果文件內(nèi)容沒有變化,一樣會修改這個時間,所以再次請求還是會重新加載資源,而不會使用緩存。
HTTP 1.1
引入了文件標簽 e-tag ,e-tag 是文件或?qū)ο蟮奈ㄒ粯俗R,也就是一個MD5值,e-tag通過Response Heasers 返回。e-tag 在使用時會結(jié)合 If-None-Match 搭配使用,當緩存過期時,瀏覽器會在請求頭中設置 If-None-Match,值服務端返回的e-tag值(MD5),當文件未發(fā)生變化時,MD5值是不變的,此時服務端可以響應 304 狀態(tài)碼,瀏覽器繼續(xù)使用本地緩存,如果返回200,則服務器返回新的文件和新的 e-tag值。
HTTP1.1中還增加了新的緩存控制參數(shù),就是Cache-Control,在瀏覽器請求服務器資源時設置。如下就是Cache-Control的使用案例,表示這個Response緩存時間是0,也就是說每次請求都會重新獲取資源,不會使用緩存。
cache-control: max-age=0
Cache-Control 的優(yōu)先級高于 Expires ,當同時設置時,使用 Cache-Control 的設置來判斷。cache-control可以設置的參數(shù)有多個,而且請求頭和響應頭的可選參數(shù)是不一樣的。
請求頭中Cache-Control可選參數(shù)
| 字段名字 | 參數(shù) | 說明 |
|---|---|---|
| no-cache | 無 | 告知(代理)服務器不使用緩存,強制向服務器發(fā)起請求 |
| no-store | 無 | 不緩存請求或相應的任何內(nèi)容 |
| max-age=seconds | 必須,單位:秒 | 告知服務器客戶端希望接收一個存在時間不大于(seconds)的資源 |
| max-stale(=seconds) | 可省略,單位:秒 | 告知服務器愿意接收一個超過緩存時間的資源,如果有指定seconds,則值為seconds,沒有指定則表示任意超出時間 |
| min-refresh=seconds | 必須,單位,秒 | 告知服務器希望接收一個在小于seconds秒內(nèi)被更新過的資源 |
| no-transform | 無 | 告知服務器客戶端希望獲取實體數(shù)據(jù)沒有被轉(zhuǎn)換的資源(比如不被壓縮) |
| only-if-cached | 無 | 告知服務器客戶端希望獲取緩存的內(nèi)容,如果存在緩存,則不用向源服務器發(fā)去請求 |
| cache-extension | - | 自定義擴展值,若服務器不識別該值將被忽略掉 |
響應頭中Cache-Control可選參數(shù)
| 字段名字 | 說明 | |
|---|---|---|
| public | 無 | 表明任何情況下都得緩存該資源(即使是需要HTTP認證的資源) |
| private[="filed-name"] | 可省略 | 表明趕回報文中全部或部分(若指定了filed-name則為filed-name的字段數(shù)據(jù))<br />僅開放給某些用戶(服務器指定的share-user,如代理服務器)做緩存使用,<br />其他用戶則不能緩存這些數(shù)據(jù) |
| no-cache | 可省略 | 不直接使用緩存,要向服務器確認有效性 |
| no-store | 無 | 不緩存請求或響應的任何內(nèi)容 |
| no-transform | 無 | 代理不可更改媒體類型 |
| must-revalidate | 無 | 當前資源一定是向源服務器發(fā)起請求驗證有效性的,若請求失敗返回504 |
| proxy-revalidate | 無 | 要求代理緩存服務器對緩存有效性進行再次確認 |
| max-age=seconds | 必須,單位:秒 | 告知客戶端該資源的有效時間 |
| s-maxage=seconds | 必須,單位:秒 | 公共緩存服務器相應的最大age值 |
| cache-extension | - | 自定義擴展值,如果瀏覽器不識別該值將被忽略 |
需要注意的是以上這些參數(shù)都是需要使用HTTP1.1及以上才有用的,其中no-store的優(yōu)先級最高。
常見的HTTP狀態(tài)碼
內(nèi)容源自菜鳥教程,個人整理所需,無意侵權(quán),源地址:
https://www.runoob.com/http/http-status-codes.html
| 狀態(tài)碼 | 英文名稱 | 描述 |
|---|---|---|
| 200 | OK | 請求成功。一般用于GET與POST請求 |
| 202 | Accepted | 已接受。已經(jīng)接受請求,但未處理完成 |
| 203 | Non-Authoritative Information | 非授權(quán)信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本 |
| 205 | Reset Content | 重置內(nèi)容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖??赏ㄟ^此返回碼清除瀏覽器的表單域 |
| 304 | Not Modified | 未修改。所請求的資源未修改,服務器返回此狀態(tài)碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源 |
| 305 | Use Proxy | 用代理。所請求的資源必須通過代理訪問 |
| 400 | Bad Request | 客戶端請求的語法錯誤,服務器無法理解 |
| 401 | Unauthorized | 請求要求用戶的身份認證 |
| 403 | Forbidden | 服務器理解請求客戶端的請求,但是拒絕執(zhí)行此請求 |
| 404 | Not Found | 服務器無法根據(jù)客戶端的請求找到資源(網(wǎng)頁)。通過此代碼,網(wǎng)站設計人員可設置"您所請求的資源無法找到"的個性頁面 |
| 405 | Method Not Allowed | 客戶端請求中的方法被禁止 |
| 406 | Not Acceptable | 服務器無法根據(jù)客戶端請求的內(nèi)容特性完成請求 |
| 408 | Request Time-out | 服務器等待客戶端發(fā)送的請求時間過長,超時 |
| 500 | Internal Server Error | 服務器內(nèi)部錯誤,無法完成請求 |
| 502 | Bad Gateway | 作為網(wǎng)關(guān)或者代理工作的服務器嘗試執(zhí)行請求時,從遠程服務器接收到了一個無效的響應 |
| 503 | Service Unavailable | 由于超載或系統(tǒng)維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中 |
| 504 | Gateway Time-out | 充當網(wǎng)關(guān)或代理的服務器,未及時從遠端服務器獲取請求 |
參考內(nèi)容:
上野宣《圖解HTTP》
https://blog.csdn.net/u012375924/article/details/82806617
http://www.itdecent.cn/p/cd9f28d35727
https://www.runoob.com/http/http-status-codes.html
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!