Skip to content
ADP
API Design PrincipleBETA

[ADP-370] HTTP 快取: Last-Modified

流程

  1. 伺服器在回應中包含 Last-Modified 標頭,表示資源最後修改的時間。
  2. 客戶端儲存此值,並在後續請求中使用 If-Modified-Since 標頭包含它。
  3. 伺服器比較 If-Modified-Since 日期與資源的最後修改日期。
  4. 如果資源自 If-Modified-Since 中的日期以來未被修改,伺服器回應 304 Not Modified 狀態。

指導

  • 在適當時候應該在回應標頭中使用 Last-Modified 進行快取。
  • 必須確保 Last-Modified 日期準確,並在資源變更時更新。
  • 應該在伺服器端實現對 If-Modified-Since 請求的適當處理。
  • 可以將 Last-ModifiedETag 結合使用,以實現更強大的快取機制,如 ADP-134 中所述。

實現細節

  • 瀏覽器會自動在後續請求中附加 If-Modified-Since。對於非瀏覽器客戶端(例如 curl 等命令行工具或伺服器端請求),您可能需要手動包含 If-Modified-Since 標頭。
  • 伺服器應實現可靠的方法來追蹤和更新 Last-Modified 日期。這可能涉及資料庫時間戳、檔案系統元數據或其他適當的機制。
  • 回應 If-Modified-Since 請求時:
    • 如果資源未被修改,返回 304 Not Modified 狀態,不帶主體。
    • 如果資源已被修改,返回 200 OK 狀態,帶有完整資源和更新後的 Last-Modified 標頭。

最佳實踐

  1. 對於不經常變更且有明確最後修改時間的資源,使用 Last-Modified
  2. Last-ModifiedETag 結合使用,以實現更精確的快取控制,如 ADP-134 中所述。
  3. 確保您的伺服器時鐘同步,以避免基於時間的快取問題。
  4. 對於動態生成的內容要小心;確保 Last-Modified 日期準確反映內容變更。
  5. 考慮除 Last-Modified 外還使用 Cache-Control 標頭,以實現更細粒度的快取控制,如 ADP-134 中所討論。

示例

伺服器回應(初始請求)

http
HTTP/1.1 200 OK
Content-Type: application/json
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
Cache-Control: public, max-age=3600

{
  "data": "這是資源內容"
}

後續客戶端請求

http
GET /resource HTTP/1.1
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT

伺服器回應(未修改)

http
HTTP/1.1 304 Not Modified

安全考慮

  • 確保 Last-Modified 日期不會洩露有關您的系統或更新模式的敏感資訊。
  • 注意客戶端可以操縱 If-Modified-Since 標頭;始終在伺服器端驗證它。
  • 考慮快取對敏感或用戶特定數據的影響。

參考