Cloudflare chính thức hỗ trợ Vary trong Cache Rules: Giải quyết phần "xấu xí" nhất của HTTP

Công nghệ23 tháng 9, 2026·6 phút đọc

Cloudflare vừa triển khai hỗ trợ header Vary trong Cache Rules trên mọi gói dịch vụ, cho phép người dùng kiểm soát cách xử lý các header thương lượng như Accept, Accept-Language và Accept-Encoding. Tính năng này giải quyết bài toán nan giải: một URL có thể có nhiều phản hồi đúng, nhưng cache cần biết sự khác biệt nào thực sự quan trọng để tránh phân mảnh cache và giảm tỷ lệ cache hit.

Cloudflare chính thức hỗ trợ Vary trong Cache Rules: Giải quyết phần "xấu xí" nhất của HTTP

Cloudflare chính thức hỗ trợ Vary trong Cache Rules: Giải quyết phần "xấu xí" nhất của HTTP

Cloudflare vừa triển khai hỗ trợ header Vary trong Cache Rules trên tất cả các gói dịch vụ, từ Free đến Enterprise. Đây là bước tiến quan trọng giải quyết một trong những vấn đề phức tạp nhất của HTTP caching: làm sao để cache biết được sự khác biệt nào giữa các request thực sự quan trọng và sự khác biệt nào chỉ là "nhiễu".

Minh họa cơ chế cache và Vary trong HTTPMinh họa cơ chế cache và Vary trong HTTP

Vary — "Phần xấu xí nhất của HTTP" nhưng không thể thiếu

Header Vary từng bị mô tả là "phần xấu xí nhất của HTTP mà chúng ta chưa cải thiện được", với "cơ chế cồng kềnh, khó hiểu""khả năng tương tác giữa các intermediary khá tệ". Thế nhưng, xấu xí không có nghĩa là vô dụng.

Vấn đề cốt lõi rất đơn giản: một URL có thể có nhiều phản hồi đúng. Ví dụ, server có thể trả về định dạng ảnh khác nhau cho các trình duyệt khác nhau, hoặc nội dung ngôn ngữ khác nhau tùy theo header Accept-Language.

Nếu cache bỏ qua Vary, nó có nguy cơ trả sai dữ liệu cho request. Nhưng nếu cache coi mọi giá trị header thô là khác biệt, chỉ một vài request tương tự có thể phân tán thành hàng nghìn entry cache gần như không thể tái sử dụng.

Đây chính là nghịch lý trung tâm của Vary: Vary cho cache biết trường request nào có thể ảnh hưởng đến phản hồi, nhưng không cho biết sự khác biệt nào thực sự quan trọng.

Bài toán phân mảnh cache

Hãy xét một ví dụ cụ thể. Origin chỉ phục vụ nội dung bằng ba ngôn ngữ: Anh, Pháp, Đức. Một client gửi:

Accept-Language: en-US, fr;q=0.8

Client khác gửi:

Accept-Language: fr;q=0.8, en-GB

Cả hai request đều ưu tiên tiếng Anh, và origin sẽ trả về cùng một phản hồi tiếng Anh. Nhưng cache so sánh giá trị thô sẽ không thể giả định chúng tương đương — thứ tự và tag ngôn ngữ khác nhau. Kết quả: cache lưu chúng thành hai variant riêng biệt dù nội dung hoàn toàn giống nhau.

Vấn đề này nhân lên theo cấp số nhân khi phản hồi phụ thuộc vào nhiều trường. Mười giá trị trên một trường tạo ra 10 variant. Mười giá trị trên ba trường có thể tạo ra 1.000 tổ hợp. Trong thực tế, header như User-Agent có vô số giá trị, cookie có thể là duy nhất cho từng người dùng, và các header tùy chọn có thể khác nhau về thứ tự, định dạng (dấu cách và tab đều quan trọng!) và giá trị chất lượng.

Kết quả là một cache hoàn toàn chính xác nhưng gần như luôn "lạnh" — các entry không bao giờ được tái sử dụng đủ để duy trì trong cache. Chúng tiêu tốn dung lượng, đẩy nhau ra khỏi cache, làm giảm tỷ lệ cache hit và tăng tải lên origin server.

Một phân tích trên hơn 120 triệu phản hồi từ gần 50.000 trang web phổ biến cho thấy gần 3.000 trang có Vary trên bốn trường trở lên. Một số trang có Vary trên 10, 23, thậm chí 47 trường.

Giải pháp của Cloudflare: Ba hành động kiểm soát Vary

Cloudflare giải quyết bài toán bằng cách tách quyết định thành hai phần:

  • Origin sử dụng Vary để xác định các request header có thể ảnh hưởng đến phản hồi
  • Cache Rule quyết định cách Cloudflare xử lý giá trị của từng header

Ba hành động có sẵn:

  • Normalize (chuẩn hóa): Chuẩn hóa request header trước khi chọn variant cache, giúp các request tương đương chia sẻ phản hồi cache. Đây là điểm khởi đầu được khuyến nghị cho các header thương lượng nơi nhiều giá trị request ánh xạ vào một tập nhỏ phản hồi.
  • Passthrough (truyền nguyên): Sử dụng byte thô của request header để khớp cache, bảo toàn casing, khoảng trắng, thứ tự và giá trị trùng lặp. Dùng cho các header có tập giá trị được kiểm soát, nơi giá trị chính xác thay đổi phản hồi.
  • Bypass (bỏ qua): Không lưu phản hồi khi origin nêu tên header đó trong Vary. Dùng cho các header được cá nhân hóa, có cardinality cao hoặc bất ngờ như Cookie hoặc User-Agent.

Lưu ý quan trọng: Vary: * luôn bypass cache, bất kể cấu hình hành động nào.

Cách chuẩn hóa hoạt động

Với Accept, Accept-LanguageAccept-Encoding, Cloudflare thực hiện chuẩn hóa theo các bước:

  • Chuyển giá trị sang chữ thường
  • Sắp xếp theo quality value, cao nhất trước, với thứ tự alphabet để phá vỡ thế cân bằng
  • Loại bỏ tham số khỏi các entry có quality value khác không
  • Có thể giữ lại chỉ các media type hoặc ngôn ngữ được chỉ định trong cấu hình

Điều này có nghĩa là hai request Accept-Language: en-US, fr;q=0.8fr;q=0.8, en-GB có thể được chuẩn hóa thành cùng một giá trị en,fr và chia sẻ phản hồi cache.

Để giữ việc chọn phản hồi ở origin khớp với việc khớp cache, Cloudflare chuyển tiếp các giá trị AcceptAccept-Language đã chuẩn hóa đến origin. Điều này cũng áp dụng cho Accept-Encoding khi tính năng Respect Strong ETags được bật.

Vì sao không dùng custom cache key?

Một câu hỏi hiển nhiên: "Tại sao không thêm Accept và Accept-Language vào custom cache key?"

Câu trả lời nằm ở sự khác biệt về bản chất:

  • Custom cache key thêm các chiều đã cấu hình vào mọi phản hồi được rule bao phủ, dù origin có sử dụng chúng hay không
  • Vary được điều khiển bởi phản hồi, linh hoạt hơn

Cloudflare khuyến nghị: dùng custom cache key khi một thuộc tính request luôn luôn định nghĩa tài nguyên. Dùng Vary khi origin khai báo cùng một tập trường request trên các phản hồi có thể cache.

Cấu hình qua Rulesets API

Tính năng này khả dụng qua Rulesets API trong phase http_request_cache_settings. Ví dụ cấu hình chuẩn hóa:

{
  "rules": [
    {
      "ref": "vary_negotiated_content",
      "description": "Cache bounded negotiated representations",
      "expression": "(http.host eq \"example.com\" and http.request.uri.path eq \"/catalog\")",
      "action": "set_cache_settings",
      "action_parameters": {
        "cache": true,
        "vary": {
          "default": { "action": "normalize" },
          "headers": {
            "accept": {
              "action": "normalize",
              "media_types": ["text/html", "application/json"]
            },
            "accept-language": {
              "action": "normalize",
              "languages": ["en", "fr", "de"]
            }
          }
        }
      }
    }
  ]
}

Ý nghĩa đối với developer Việt Nam

Với các đội ngũ phát triển web và API tại Việt Nam, đặc biệt là những đơn vị phục vụ người dùng đa ngôn ngữ hoặc phân phối nội dung qua CDN, tính năng này mang lại lợi ích thiết thực:

  • Giảm chi phí băng thông nhờ tỷ lệ cache hit cao hơn, đặc biệt quan trọng với các dự án có lưu lượng lớn
  • Kiểm soát linh hoạt mà không cần viết Worker hay sao chép logic thương lượng của origin
  • Tương thích với Terraform, phù hợp với quy trình Infrastructure as Code mà nhiều startup Việt Nam đang áp dụng

Cloudflare cho biết đang xem xét ý tưởng từ dự thảo Availability Hints đã hết hạn, có thể cho phép origin mô tả trực tiếp các representation mà nó phục vụ, giảm bớt công việc cấu hình thủ công.

Tính năng Vary trong Cache Rules hiện có sẵn trên tất cả các gói Free, Pro, Business và Enterprise thông qua dashboard Cloudflare, Rulesets API và Terraform.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗