HTTP कैशिंग कैसे काम करती है?
HTTP कैशिंग ब्राउज़र या साझा कैश (CDN, प्रॉक्सी) को ऑरिजिन से दोबारा पूछे बिना स्टोर किया रिस्पॉन्स दोबारा इस्तेमाल करने देती है। Cache-Control बताता है कि रिस्पॉन्स स्टोर हो सकता है या नहीं और कितनी देर (max-age, s-maxage, no-store, private); ETag और Last-Modified कंडीशनल रिक्वेस्ट से सस्ते में रीवैलिडेट करने देते हैं जो कुछ न बदलने पर 304 Not Modified लौटाती है। नियम RFC 9111 में हैं।
कैश हेडर एनालाइज़र कैसे इस्तेमाल करें
- रिस्पॉन्स हेडर पेस्ट करें (कच्चा रिस्पॉन्स, curl -I का आउटपुट या "Name: value" पंक्तियाँ)।
- रिक्वेस्ट मेथड चुनें, और अगर पेस्ट में स्टेटस लाइन नहीं है तो स्टेटस कोड भी।
- फ़ैसला पढ़ें: रिस्पॉन्स संग्रहित होगा या नहीं, कितनी देर तक, और उसकी revalidation कैसे होगी।
- फ़ाइंडिंग में लीक (shared कैश में निजी डेटा) और आपसी विरोधाभास देखें।
- सुझाई गई नीति को शुरुआती बिंदु मानकर कॉपी करें और अवधियाँ अपने हिसाब से बदल लें।
कैश हेडर एनालाइज़र की खूबियाँ
- हर Cache-Control निर्देश समझाता है और max-age, s-maxage या Expires − Date से freshness की अवधि निकालता है
- ब्राउज़र कैश और shared कैश (CDN, प्रॉक्सी) के लिए अलग-अलग फ़ैसले
- ETag / Last-Modified, stale-while-revalidate और stale-if-error से revalidation का व्यवहार
- Vary का विश्लेषण: Accept-Encoding अपेक्षित, Cookie/User-Agent से कैश का बिखराव, Vary: * की चेतावनियाँ
- CDN हेडर की व्याख्या: cf-cache-status, x-cache, x-vercel-cache, CDN-Cache-Control, Surrogate-Control, Age
- टकराव की पहचान (no-store + max-age, public + private, कैश हो सकने वाले authenticated रिस्पॉन्स) और एक सुझाई गई नीति
कैश हेडर एनालाइज़र का उदाहरण
कुकी सेट करता हुआ public रिस्पॉन्स
इनपुट:
Cache-Control: public, max-age=600, s-maxage=3600
ETag: W/"5f8d-1a2b3c"
Vary: Accept-Encoding, Cookie
Age: 240
cf-cache-status: HIT
Set-Cookie: session=abc123; Path=/; HttpOnlyआउटपुट:
Verdict: Cacheable: fresh for 10 min in browsers and 1 h in shared caches.
Age: 4 min — shared caches: 56 min of freshness remaining · browsers: 6 min remaining
High — Cache-Control: The response sets a cookie but is cacheable by shared caches — personal data may be served to other users.
Medium — Vary: Vary on Cookie fragments the cache into thousands of variants.
cf-cache-status HIT: Cloudflare served the response from its edge cache.ब्राउज़र कैश: max-age=600
- 0–10 minfresh
- > 10 minstale: revalidate
- 14 min आयु (Age)
max-ageमें से घटाया गया: ब्राउज़र में 6 मिनट की freshness बाकी।
शेयर्ड कैश (CDN/प्रॉक्सी): s-maxage=3600
- 0–60 minकुकी के बावजूद fresh: दूसरे यूज़र को मिल सकती हैफ़ेल
- > 60 minstale: revalidate
- 14 min आयु (Age)
s-maxageमें से घटाया गया: shared कैश में 56 मिनट की freshness बाकी।
ब्राउज़र s-maxage को अनदेखा करते हैं; shared कैश max-age की जगह उसे मानते हैं। stale कॉपी If-None-Match से revalidate होती है, और कुछ न बदला हो तो 304 उसे फिर fresh कर देता है। यहाँ सुझाई गई नीति: Cache-Control: private, no-cache।
कैश हेडर एनालाइज़र के बारे में अक्सर पूछे जाने वाले सवाल
freshness की अवधि किससे तय होती है?
Cache-Control में पहले s-maxage (सिर्फ़ shared कैश के लिए), फिर max-age, और उसके बाद Expires घटा Date। उस समय के बाद कॉपी stale हो जाती है और उसे revalidate या दोबारा fetch करना पड़ता है।
no-cache और no-store में क्या अंतर है?
no-store का मतलब है रिस्पॉन्स कहीं भी संग्रहित न करें; no-cache का मतलब है वह संग्रहित हो सकता है, पर हर बार इस्तेमाल से पहले origin से revalidate करना ज़रूरी है।
Vary क्यों मायने रखता है?
कैश सूचीबद्ध रिक्वेस्ट हेडर के हर अलग संयोजन की एक-एक कॉपी रखते हैं। Vary: Accept-Encoding अपेक्षित है; Vary: Cookie या User-Agent कैश को हज़ारों वेरिएंट में बिखेर देता है और hit ratio ख़त्म कर देता है।
कौन-से CDN हेडर समझाए जाते हैं?
cf-cache-status, x-cache, x-cache-hits, x-served-by, x-vercel-cache, CDN-Cache-Control, Cloudflare-CDN-Cache-Control, Surrogate-Control, Age और कई अन्य।
क्या यह निजी डेटा लीक होने पर चेतावनी देता है?
हाँ — जो रिस्पॉन्स कुकी सेट करता है या authenticated है, फिर भी shared कैश में कैश हो सकता है, उसे उच्च गंभीरता की फ़ाइंडिंग के रूप में बताया जाता है।
तकनीकी नोट्स
freshness RFC 9111 की प्राथमिकता के अनुसार निकाली जाती है: s-maxage सिर्फ़ shared कैश पर लागू होता है और वहाँ max-age पर हावी रहता है; max-age, Expires पर हावी रहता है; अमान्य Expires तारीख़ का मतलब है "पहले से ही stale"। Age हर अवधि में से अलग-अलग घटाया जाता है, इसलिए टूल अलग-अलग दिखाता है कि कॉपी shared कैश में और ब्राउज़र में (जो s-maxage को अनदेखा करते हैं) कितनी देर fresh रहेगी।
जब डिफ़ॉल्ट रूप से कैश हो सकने वाला स्टेटस (200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501) बिना स्पष्ट freshness जानकारी के आता है, तो heuristic कैशिंग की सूचना दी जाती है — ऐसे में कैश ख़ुद कोई अवधि मान सकते हैं, आमतौर पर Last-Modified की उम्र का 10%।
संदर्भ
- RFC 9111: HTTP CachingCache-Control, Expires, ETag और वैलिडेटर कैसे तय करते हैं कि रिस्पॉन्स स्टोर और पुन: उपयोग हो सकता है या नहीं।
- HTTP caching — MDNप्राइवेट बनाम शेयर्ड कैश, फ़्रेशनेस, ETag / Last-Modified से वैलिडेशन और आम Cache-Control पैटर्न।