HTTPQUERY
Bahasa Indonesia

Vary

Penggunaan

Satu URL sering kali menghasilkan response yang berbeda tergantung pada apa yang dikirim klien. Server yang mengompresi dengan gzip untuk satu klien dan Brotli untuk klien lain menyajikan dua representasi berbeda dari sumber daya yang sama. Header Vary mencatat header request mana yang membuat server memilih suatu representasi tertentu, sehingga cache memperoleh informasi yang dibutuhkan untuk menyimpan dan mencocokkan salinan yang tepat.

Ketika cache menerima permintaan untuk sebuah URL yang sudah memiliki response tersimpan, cache membandingkan header Vary yang terdaftar antara request baru dan request yang tersimpan. Jika nilainya cocok, response yang di-cache tetap valid. Jika berbeda, cache mengambil response baru dari origin.

Nilai yang paling umum adalah Accept-Encoding (untuk negosiasi kompresi) dan Accept (untuk negosiasi konten). Konfigurasi dynamic serving yang menyajikan HTML berbeda kepada klien mobile dan desktop berdasarkan string User-Agent menambahkan Vary: User-Agent untuk menandai variasi ini.

Nilai wildcard * berarti setiap request dianggap unik dan secara efektif menonaktifkan caching untuk sumber daya tersebut. Hal ini jarang tepat dan sebagian besar cache memperlakukan response Vary: * sebagai tidak dapat di-cache.

Catatan

Google tidak menggunakan header Vary untuk memahami hubungan antara versi mobile dan desktop dalam pengindeksan pencarian. Header ini adalah mekanisme caching, bukan sinyal pencarian. Situs yang menggunakan dynamic serving dengan Vary: User-Agent tetap memperoleh manfaat dari perilaku cache yang benar, tetapi header itu sendiri tidak berpengaruh pada cara Google menemukan atau mengindeks konten mobile. Google juga menyarankan agar URL m-dot tidak dijadikan versi kanonis meskipun pengindeksan bersifat mobile-first, dan merekomendasikan desain responsif sebagai konfigurasi yang lebih disukai.

Accept-Encoding

Menunjukkan bahwa response bervariasi menurut header request Accept-Encoding. Algoritme kompresi yang berbeda (gzip, br, zstd) menghasilkan body response yang berbeda untuk sumber daya yang sama. Ini adalah nilai Vary yang paling luas digunakan.

Accept

Menunjukkan bahwa response bervariasi menurut header request Accept. Negosiasi konten menyajikan tipe media yang berbeda (HTML, JSON, XML) dari URL yang sama berdasarkan preferensi klien.

Accept-Language

Menunjukkan bahwa response bervariasi menurut header request Accept-Language. Situs multibahasa yang menyajikan konten terlokalisasi dari URL yang sama menyertakan nilai ini.

User-Agent

Menunjukkan bahwa response bervariasi menurut header request User-Agent. Konfigurasi dynamic serving menyajikan HTML yang berbeda kepada klien mobile dan desktop dari URL yang sama.

Vary: Cookie berarti response berbeda berdasarkan nilai header Cookie. Cache menyimpan varian terpisah untuk setiap string Cookie yang unik, sehingga menyebabkan fragmentasi cache yang signifikan karena setiap pengguna terautentikasi memiliki cookie sesi yang berbeda. Batasi Vary: Cookie hanya pada response yang benar-benar bergantung pada nilai cookie (halaman yang dipersonalisasi, dasbor) dan hindari menyetel nilai tersebut pada aset statis publik.

* (wildcard)

Nilai wildcard menandakan bahwa response bervariasi menurut faktor yang tidak tertangkap dalam sebuah header request. Cache memperlakukannya sebagai tidak dapat di-cache. Jarang digunakan secara sengaja.

Contoh

Server mengompresi response menggunakan encoding yang diminta klien. Header Vary: Accept-Encoding memberi tahu cache perantara untuk menyimpan salinan terpisah bagi request gzip dan Brotli, alih-alih menyajikan response terkompresi gzip kepada klien yang mendukung Brotli.

Vary: Accept-Encoding

Konfigurasi negosiasi konten menyajikan JSON atau HTML dari endpoint yang sama. Cache menyimpan response terpisah berdasarkan nilai header Accept.

Vary: Accept

Beberapa header yang memengaruhi response dicantumkan sebagai nilai yang dipisahkan koma. Di sini response bergantung pada encoding yang diterima sekaligus bahasa yang dipilih.

Vary: Accept-Encoding, Accept-Language

Konfigurasi dynamic serving menyajikan HTML yang berbeda kepada user agent mobile dan desktop. Cache menyimpan versi terpisah yang dikunci berdasarkan string User-Agent lengkap.

Vary: User-Agent

Memadukan Vary dengan Cache-Control mengendalikan sekaligus apa yang bervariasi dan berapa lama setiap varian tetap segar.

Cache-Control: public, max-age=3600
Vary: Accept-Encoding

Pemecahan masalah

Masalah caching yang disebabkan oleh header Vary yang hilang atau terlalu luas sering muncul sebagai pengguna yang menerima konten yang salah.

CDN menyajikan varian cache yang keliru. Server mengembalikan konten berbeda berdasarkan sebuah header request tetapi menghilangkan nilai Vary yang sesuai. CDN menyimpan response pertama dalam cache dan menyajikan salinan yang sama kepada semua klien tanpa memedulikan header request mereka. Tambahkan nama header yang relevan ke daftar Vary. Uji dengan mengirim request bernilai header berbeda melalui curl dan bandingkan header response X-Cache atau Age: curl -H “Accept-Encoding: gzip” -v https://cdn.example.re/style.css curl -H “Accept-Encoding: br” -v https://cdn.example.re/style.css

Fragmentasi cache akibat Vary: User-Agent. String User-Agent memiliki ribuan nilai unik. Mencantumkan User-Agent pada header Vary menciptakan entri cache terpisah untuk hampir setiap pengunjung, sehingga menghancurkan rasio cache hit. CDN seperti Cloudflare dan Fastly menormalkan User-Agent menjadi kelas perangkat. Jika memungkinkan, gunakan header yang sudah dinormalkan seperti Sec-CH-UA-Mobile atau header tipe perangkat khusus CDN, bukan User-Agent mentah.

Vary: * menonaktifkan caching sepenuhnya. Wildcard memberi tahu cache bahwa response bervariasi menurut faktor di luar header request mana pun. Sebagian besar cache memperlakukannya sebagai tidak dapat di-cache dan tidak pernah menyajikan salinan tersimpan. Hapus Vary: * kecuali memang bermaksud menonaktifkan seluruh caching untuk sumber daya tersebut. Jika variasi digerakkan oleh header request tertentu, sebutkan header itu secara eksplisit.

Hilangnya Vary: Origin menyebabkan peracunan cache CORS. Server mengembalikan nilai Access-Control-Allow-Origin dinamis berdasarkan header request Origin tetapi tidak menyertakan Vary: Origin. CDN menyimpan response dengan satu origin dan menyajikan header CORS yang sama ke origin berbeda, sehingga browser memblokir response tersebut. Tambahkan Vary: Origin pada setiap response yang memantulkan nilai origin dinamis. Untuk mendiagnosis, kirim dua request curl dari origin berbeda dan periksa apakah Access-Control-Allow-Origin yang di-cache berubah: curl -H “Origin: https://a.example.re” -v https://api.example.re/data curl -H “Origin: https://b.example.re” -v https://api.example.re/data

Ketidakkonsistenan Vary: Accept-Encoding antara gzip dan Brotli. Beberapa server origin mengompresi dengan gzip tetapi edge CDN mengompresi ulang menjadi Brotli, sehingga terjadi ketidakcocokan antara encoding yang di-cache dan kunci Vary. Pastikan origin dan CDN sepakat mengenai perilaku encoding. Di nginx, setel gzip_vary on; untuk menambahkan Vary: Accept-Encoding secara otomatis. Saat menggunakan Brotli berdampingan dengan gzip, pastikan kedua modul menambahkan nilai Vary yang sama agar cache menyimpan entri terpisah per encoding.