[ADP-370] HTTP 快取: Last-Modified
流程
- 伺服器在回應中包含
Last-Modified
標頭,表示資源最後修改的時間。 - 客戶端儲存此值,並在後續請求中使用
If-Modified-Since
標頭包含它。 - 伺服器比較
If-Modified-Since
日期與資源的最後修改日期。 - 如果資源自
If-Modified-Since
中的日期以來未被修改,伺服器回應 304 Not Modified 狀態。
指導
- 在適當時候應該在回應標頭中使用
Last-Modified
進行快取。 - 必須確保
Last-Modified
日期準確,並在資源變更時更新。 - 應該在伺服器端實現對
If-Modified-Since
請求的適當處理。 - 可以將
Last-Modified
與ETag
結合使用,以實現更強大的快取機制,如 ADP-134 中所述。
實現細節
- 瀏覽器會自動在後續請求中附加
If-Modified-Since
。對於非瀏覽器客戶端(例如curl
等命令行工具或伺服器端請求),您可能需要手動包含If-Modified-Since
標頭。 - 伺服器應實現可靠的方法來追蹤和更新
Last-Modified
日期。這可能涉及資料庫時間戳、檔案系統元數據或其他適當的機制。 - 回應
If-Modified-Since
請求時:- 如果資源未被修改,返回 304 Not Modified 狀態,不帶主體。
- 如果資源已被修改,返回 200 OK 狀態,帶有完整資源和更新後的
Last-Modified
標頭。
最佳實踐
- 對於不經常變更且有明確最後修改時間的資源,使用
Last-Modified
。 - 將
Last-Modified
與ETag
結合使用,以實現更精確的快取控制,如 ADP-134 中所述。 - 確保您的伺服器時鐘同步,以避免基於時間的快取問題。
- 對於動態生成的內容要小心;確保
Last-Modified
日期準確反映內容變更。 - 考慮除
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
標頭;始終在伺服器端驗證它。 - 考慮快取對敏感或用戶特定數據的影響。