No-Vary-Search header

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

HTTP No-Vary-Search 響應頭指定了一組規則,用於定義 URL 的查詢引數如何影響快取匹配。這些規則決定了具有不同 URL 引數的相同 URL 是否應作為單獨的瀏覽器快取條目儲存。

這允許瀏覽器在 URL 引數不匹配但返回相同內容時,重用現有資源,以避免再次獲取資源的開銷。

頭型別 響應頭
禁止請求頭

語法

http
No-Vary-Search: key-order
No-Vary-Search: params
No-Vary-Search: params=("param1" "param2")
No-Vary-Search: params, except=("param1" "param2")
No-Vary-Search: key-order, params, except=("param1")

指令

key-order 可選

表示如果 URL 中引數的順序是唯一的區別,則 URL 不會作為單獨的條目進行快取。其他引數的出現導致 URL 單獨快取。

params 可選

布林值或字串列表

  • 作為布林值 (params),它表示僅引數不同的 URL 不會作為單獨的條目進行快取。
  • 一個空格分隔的字串內部列表 (params=("param1" "param2"))。表示僅透過列出的引數不同的 URL 不會作為單獨的條目進行快取。其他引數的出現導致它們單獨快取。
except 可選

一個空格分隔的字串內部列表 (except=("param1" "param2"))。表示僅透過列出的引數不同的 URL 作為單獨的條目進行快取。必須包含布林值 params 指令才能使其生效 (params, except=("param1" "param2"))。不在 except= 列表中的其他引數的出現不會導致 URL 作為單獨的條目進行快取。

描述

與 Speculation Rules API 的關係

Speculation Rules API 支援使用 No-Vary-Search 頭部來重用具有不同 URL 引數(如果它們包含在 No-Vary-Search 頭部中)的現有預取或預渲染頁面。

警告:將預渲染與 No-Vary-Search 一起使用時必須格外小心,因為頁面可能最初是使用不同的 URL 引數預渲染的。No-Vary-Search 用於從伺服器提供相同資源,但客戶端出於各種原因(客戶端渲染、用於分析測量的 UTM 引數等)使用的 URL 引數。由於初始預渲染可能用於不同的 URL 引數,因此任何依賴它們的程式碼都應僅在預渲染啟用後執行。

Speculation Rules API 還可以包含一個 expects_no_vary_search 欄位,它指示瀏覽器透過猜測規則接收預取/預渲染請求的文件的預期 No-Vary-Search 值(如果有)。瀏覽器可以使用此資訊提前確定是等待現有預取/預渲染完成,還是在猜測規則匹配時啟動新的獲取請求更有效。請參閱“expects_no_vary_search”示例,瞭解如何使用此功能。

示例

允許來自引數順序不同的 URL 的響應匹配相同的快取條目

例如,如果你有一個搜尋頁面,它將其搜尋條件儲存在 URL 引數中,並且你無法保證每次都會以相同的順序將引數新增到 URL,那麼你可以使用 key-order 允許來自除了引數順序不同之外其他都相同的 URL 的響應匹配相同的快取條目。

http
No-Vary-Search: key-order

當此頭部新增到關聯的響應時,以下 URL 在搜尋快取時將被視為等效

https://search.example.com?a=1&b=2&c=3
https://search.example.com?b=2&a=1&c=3

然而,不同 URL 引數的存在將導致這些 URL 單獨快取。例如

https://search.example.com?a=1&b=2&c=3
https://search.example.com?b=2&a=1&c=3&d=4

以下示例說明了如何在快取匹配的上下文中控制哪些引數被忽略。

允許來自具有不同引數的 URL 的響應匹配相同的快取條目

考慮一種情況,使用者目錄著陸頁 /users 已被快取。id 引數可能用於顯示特定使用者的資訊,例如 /users?id=345。此 URL 是否應被視為快取匹配的同一 URL 取決於應用程式的行為

  • 如果此引數的作用是載入一個包含指定使用者資訊的新頁面,則來自此 URL 的響應應單獨快取。
  • 如果此引數的作用是在同一頁面上突出顯示指定使用者,並可能顯示一個彈出面板顯示其資料,那麼瀏覽器最好使用 /users 的快取響應。這可以改善使用者頁面的載入效能。

如果你的應用程式行為與上面描述的第二個示例類似,你可以透過如下所示的 No-Vary-Search 頭部,使 /users/users?id=345 在快取目的上被視為相同:

http
No-Vary-Search: params=("id")

注意:如果使用 params 將引數從快取鍵中排除,則無論它出現在引數列表中的哪個位置,如果它包含在 URL 中,它都將在快取匹配中被忽略。

允許來自具有多個不同引數的 URL 的響應匹配相同的快取條目

假設你還有 URL 引數,用於按升序或降序字母順序對頁面上的使用者列表進行排序,並指定顯示 UI 字串的語言,例如 /users?id=345&order=asc&lang=fr

你可以讓瀏覽器在考慮快取匹配時忽略所有這些引數,如下所示:

http
No-Vary-Search: params=("id" "order" "lang")

注意:作為結構化欄位,引數應該是空格分隔的帶引號字串,如上所示,而不是逗號分隔的(開發人員可能更習慣)。

如果你希望瀏覽器在快取匹配時忽略所有這些引數以及可能存在的任何其他引數,你可以使用布林形式的 params

http
No-Vary-Search: params

指定導致快取匹配失敗的引數

假設應用程式行為不同,/users 指向主使用者目錄著陸頁,而 /users?id=345 指向特定使用者的完全獨立的詳細資訊頁。在這種情況下,你希望瀏覽器在快取匹配時忽略上面提到的所有引數,除了 id,它的存在會導致瀏覽器不匹配 /users 快取條目並從伺服器請求 /users?id=345

這可以透過以下方式實現

http
No-Vary-Search: params, except=("id")

規範

規範
No-Vary-Search HTTP 響應頭欄位
# 第 2 節

瀏覽器相容性

另見