跳到內容

HTTP 快取過期

編輯此頁面

expiration model 是兩種快取模型中最有效率且最直接的模型,應盡可能使用。當回應使用過期時間快取時,快取會直接傳回,而不會點擊應用程式,直到快取的回應過期。

過期模型可以使用兩個幾乎相同的 HTTP Header 之一來完成:ExpiresCache-Control

您可以在同一個 Response 中同時使用驗證和過期。由於過期優先於驗證,您可以從兩者的優點中受益。換句話說,透過同時使用過期和驗證,您可以指示快取提供快取的內容,同時在某個間隔(過期時間)後檢查以驗證內容是否仍然有效。

使用 Cache-Control Header 過期

大多數時候,您將使用 Cache-Control Header,它用於指定許多不同的快取指示

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(public: true, maxage: 600)]
public function index(): Response
{
    // ...
}

Cache-Control Header 將採用以下格式(可能還有其他指示)

1
Cache-Control: public, max-age=600

注意

使用 setSharedMaxAge() 方法不等同於同時使用 setPublic()setMaxAge() 方法。根據 RFC 7234 的 Serving Stale Responses 章節,s-maxage 設定(由 setSharedMaxAge() 方法新增)禁止快取在 stale-if-error 情境中使用過時的回應。這就是為什麼建議同時使用 publicmax-age 指示。

使用 Expires Header 過期

Cache-Control Header 的替代方案是 Expires。兩者之間沒有優缺點。

根據 HTTP 規範,「Expires Header 欄位給出了回應被視為過時的日期/時間。」可以使用 #[Cache] 屬性的 expires 選項或 setExpires() Response 方法來設定 Expires Header

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(expires: '+600 seconds')]
public function index(): Response
{
    // ...
}

產生的 HTTP Header 將如下所示

1
Expires: Thu, 01 Mar 2011 16:00:00 GMT

注意

expires 選項和 setExpires() 方法會自動將日期轉換為 GMT 時區,這是規範所要求的。

請注意,在 1.1 之前的 HTTP 版本中,原始伺服器不需要傳送 Date Header。因此,快取(例如瀏覽器)可能需要依賴本機時鐘來評估 Expires Header,這使得生命週期計算容易受到時鐘偏差的影響。Expires Header 的另一個限制是,規範指出「HTTP/1.1 伺服器不應傳送未來一年以上的 Expires 日期。」

注意

根據 RFC 7234 的 Calculating Freshness Lifetime 章節,當定義了 Cache-Control Header 的 s-maxagemax-age 指示時,Expires Header 值會被忽略。

本作品,包括程式碼範例,均根據 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本