Last-Modified深入淺出

一、基礎概念

Last-Modified是HTTP的一個頭部信息,指示一個被請求資源(如HTML、CSS、JavaScript等)的最後修改時間。它表示的是UTC時間的日期和時間字元串,以RFC 7231規範中的日期時間格式來呈現。例如:

Last-Modified: Wed, 18 Nov 2020 16:14:31 GMT

當客戶端請求某個資源時,會將上次請求該資源時得到的Last-Modified值通過If-Modified-Since請求頭部發送回伺服器。如果該資源在此時間後沒有被修改過,伺服器會返回HTTP 304「Not Modified」狀態碼,否則返回200狀態碼和新的資源內容。

另外需要注意的是,如果伺服器無法獲取被請求資源的最後修改時間,或者該資源被修改的時間不可知,則該頭部信息的值應設為一個固定的時間標記(如「0000-01-01T00:00:00Z」)。同時,當一個資源被創建時,也可以通過設置Last-Modified值為創建時間來表示該資源暫時為最新版本。

二、緩存策略優化

利用Last-Modified頭部信息可以實現緩存策略的優化。在第一次請求某個資源時,伺服器會返回資源的Last-Modified值,並在響應頭部加入Cache-Control、Expires等緩存相關的頭部信息,告知客戶端應該緩存該資源的有效期限。當下一次請求該資源時,客戶端會發送If-Modified-Since請求頭部信息以告知伺服器緩存情況,如果伺服器返回304狀態碼,表示客戶端的緩存仍然是最新的,並且該資源的有效期限還未到期,則客戶端不需要再次請求該資源,因為緩存中的版本已經是最新的了。

同時,伺服器也可以結合Etag頭部信息來進一步細化緩存策略,當資源被改動後,伺服器會更改資源的Etag值,並在下次請求時一併返回,如果客戶端的Etag值與服務端的不一致,則表示緩存已失效,需要重新獲取最新的資源。

三、服務端支持和使用注意事項

為了使伺服器支持Last-Modified頭部信息,需要在服務端編寫相應的代碼邏輯以在響應頭部中加入Last-Modified頭部信息,並處理客戶端的If-Modified-Since請求頭部信息。以下是一個簡單的例子:

import (
    "net/http"
    "time"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // 設置Last-Modified信息
    modTime := time.Date(2020, time.November, 18, 16, 14, 31, 0, time.UTC)
    w.Header().Set("Last-Modified", modTime.UTC().Format(http.TimeFormat))

    // 處理If-Modified-Since信息
    if modHeader := r.Header.Get("If-Modified-Since"); modHeader != "" {
        modSince, err := time.Parse(http.TimeFormat, modHeader)
        if err == nil && !modTime.After(modSince) {
            w.WriteHeader(http.StatusNotModified)
            return
        }
    }

    // 返回資源內容
    http.ServeFile(w, r, "path/to/resource")
}

需要注意的是,由於Last-Modified值是按UTC時間計算的,因此在響應頭部中必須將時間轉換為UTC格式。同時,如果伺服器無法獲取被請求資源的修改時間,可以忽略掉If-Modified-Since請求頭的判斷,直接返回最新的版本即可。

四、總結

Last-Modified頭部信息是HTTP協議中用於表示資源修改時間的一種標準方式,可以實現緩存、更新等優化策略,提升HTTP的性能和可靠性。在實際開發中,我們需要充分理解其原理,合理應用其優點,並注意一些問題和注意事項,以確保系統的正確性和可靠性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270836.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:38
下一篇 2024-12-16 13:38

相關推薦

  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web伺服器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變數並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——非同步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的非同步任務調度器,可以幫助開發人員高效地管理非同步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23
  • 深入淺出TermQuery

    一、TermQuery概述 TermQuery是Lucene中最基本、最簡單、最常見的查詢方法之一。它完全符合其名字,意味著只能對一個單詞進行查詢。 TermQuery可以用於搜索…

    編程 2025-04-23

發表回復

登錄後才能評論