HTTP हेडर कैसे सेट करें (कैश-कंट्रोल के लिए)?


237

मेरी साइट के लिए ब्राउज़र कैशिंग कैसे सक्षम करें? क्या मैं सिर्फ कैश-कंट्रोल कर सकता हूं: मेरे हेडर में कहीं इस तरह से सार्वजनिक?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

मैं XAMPP के नवीनतम संस्करण पर विकासशील PHP के नवीनतम संस्करण का उपयोग कर रहा हूं।


आप किस सर्वर साइड भाषा का उपयोग कर रहे हैं? PHP ?, ASP ?, JSP? जिस तरह से आप हेडर सेट करते हैं वह समान है लेकिन काफी समान नहीं है। या यदि आप छवियों को कैशिंग कर रहे हैं ... अक्सर यह आपके Apache (या वेब सर्वर)
कॉन्फिगर

अफसोस की बात है कि "समाधान" बस एक अवैध DOCTYPE ;-) उत्पन्न करता है; यदि आप इसे HTML से करना चाहते हैं (मैं इसकी अनुशंसा नहीं करूँगा), तो आप मेटा HTTP-EQUIV का

जवाबों:


198

HTML में cache-control का उपयोग करने के लिए, आप मेटा टैग का उपयोग करते हैं , जैसे

<meta http-equiv="Cache-control" content="public">

सामग्री क्षेत्र में मूल्य नीचे दिए गए चार मूल्यों में से एक के रूप में परिभाषित किया गया है।

Cache-Controlहैडर पर कुछ जानकारी इस प्रकार है

HTTP 1.1। अनुमत मूल्य = सार्वजनिक | निजी | NO-CACHE | नो-स्टोर।

सार्वजनिक - सार्वजनिक साझा कैश में कैश किया जा सकता है।
निजी - केवल निजी कैश में कैश किया जा सकता है।
नो-कैश - कैश नहीं किया जा सकता है।
नो-स्टोर - कैश किया जा सकता है लेकिन संग्रहीत नहीं है।

निर्देश CACHE-CONTROL: NO-CACHE इंगित करता है कि कैश्ड जानकारी का उपयोग नहीं किया जाना चाहिए और इसके बजाय अनुरोधों को मूल सर्वर पर भेजा जाना चाहिए। इस निर्देश का PRAGMA के समान शब्दार्थ है: NO-CACHE।

ग्राहक SHOULD में PRAGMA: NO-CACHE और CACHE-CONTROL दोनों शामिल हैं: NO-CACHE जब नो-कैश रिक्वेस्ट एक सर्वर पर भेजी जाती है जिसे HTTP / 1.1 कंप्लेंट नहीं कहा जाता है। EXPIRES भी देखें।

ध्यान दें: HTTP बयानों की तुलना में HTTP में कैश कमांड को निर्दिष्ट करना बेहतर हो सकता है, जहां वे ब्राउज़र की तुलना में अधिक प्रभावित कर सकते हैं, लेकिन प्रॉक्सी और अन्य बिचौलिये जो कैश जानकारी दे सकते हैं।


30
HTML5 इसे मना करता है और <meta>कैशिंग को निर्दिष्ट करने के लिए हमेशा एक भयानक और परतदार तरीका रहा है।
कोर्नेल

1
@porneL मुझे यह समझने में परेशानी होती है कि आपके लिंक के किस भाग में उत्तर के कौन से भाग को निषिद्ध किया गया है ... मेटा टैग चश्मा नापसंद के बारे में कुछ नहीं कहता है कि यहाँ क्या लिखा है, या इसे मना किया है?
फेलिक्स गगनोन-ग्रेनियर

1
@ FélixGagnon-Grenier "http-equiv विशेषता एक प्रगणित विशेषता है" इसका अर्थ है कि यह तालिका में केवल मूल्यों की अनुमति देता है। यहां तक ​​कि बाद के खंड ("अन्य व्यावहारिक निर्देश") में कैशिंग को भी बुलाता है:> हेडर के समान प्रगति निर्देश जो HTTP प्रसंस्करण मॉडल (जैसे कैशिंग) को प्रभावित करते हैं, उन्हें पंजीकृत नहीं किया जाना चाहिए, क्योंकि वे HTTP- स्तर के व्यवहार के लिए भिन्न होंगे। उपयोगकर्ता एजेंट जो HTML को उन उपयोगकर्ता एजेंटों की तुलना में लागू करते हैं जो नहीं करते हैं।
कोर्नेल

3
no-storeमूल्य के संबंध में उद्धृत दस्तावेज सही नहीं है (दस्तावेज़ के बावजूद RFC 2068 को संदर्भित करते हुए ) - no-storeदस्तावेज़ को कहीं भी संग्रहीत / कैश नहीं किया जाता है। जबकि no-cacheयह इसे संग्रहीत करने की अनुमति देता है, लेकिन इसे हर बार सर्वर से जांचना चाहिए। ब्राउजर बैक बटन फंक्शनलिटी आदि no-cacheको सक्षम करने के लिए पेजों को स्टोर करेगा
MrWhite

3
Google HTTP कैशिंग आईएमओ के लिए सबसे आसान संदर्भों में से एक प्रदान करता है: Developers.google.com/web/fundamentals/performance/…
MrWhite

137

आप PHP का उपयोग करके हेडर सेट कर सकते हैं :

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

ध्यान दें कि उपयोग किए गए सटीक शीर्ष लेख आपकी आवश्यकताओं पर निर्भर करेंगे (और यदि आपको HTTP 1.0 और / या HTTP 1.1 का समर्थन करने की आवश्यकता है )


3
Pragmaऔर Expiresसंभवतः अधिकांश ब्राउज़रों के लिए निरर्थक हैं। fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai हाँ HTTP / 1.0 बड़े पैमाने पर तारीख से बाहर है ... केवल उन हेडर का उपयोग करें जिनकी आपको अपने उपयोगकर्ता मैट्रिक्स के आधार पर आवश्यकता है
'22:

49

जैसा कि मैंने लिखा है कि फ़ाइल का उपयोग करना सबसे अच्छा है .htaccess। हालांकि उस समय से सावधान रहें जब आप सामग्री को कैश में छोड़ देते हैं।

उपयोग:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

कहां: 604800 = 7 दिन

PS: इसका उपयोग किसी भी हेडर को रीसेट करने के लिए किया जा सकता है


30

Http://www.askapache.com/htaccess/apache-speed-cache-control.html पर पेज कुछ इस तरह का उपयोग करने का सुझाव देता है:

कैश-कंट्रोल हेडर जोड़ें

यह आपकी रूट .htaccess फ़ाइल में जाता है लेकिन अगर आपके पास httpd.conf की पहुँच बेहतर है।

यह कोड कुछ फाइलों में कैश-कंट्रोल हेडर जोड़ने के लिए FilesMatch निर्देश और हेडर निर्देश का उपयोग करता है।

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
क्या यह महत्वपूर्ण है? "अधिकतम आयु = 290304000, सार्वजनिक" या "सार्वजनिक, अधिकतम आयु = 290304000" या दोनों समान रूप से सही हैं?
सत्य प्रकाश '’

2
यदि मान परस्पर विरोधी (जैसे cacheऔर no-cache) नहीं हैं तो आदेश मायने नहीं रखता । max-ageऔर publicसंघर्ष मत करो ताकि कोई फर्क न पड़े।
Blaise

1
ध्यान दें कि चूंकि यह Headerनिर्देश का उपयोग करता है , इसलिए आपको सक्षम करना होगा mod_headers
स्किप्पी ले ग्रैंड गौरौ

@ सिप्पी ले ग्रैंड गौरौ मैं mod_headers कैसे सक्षम करूं?
सैम

@SamuelStratford मैंने पढ़ा है यह अन्य वितरण पर अलग है, लेकिन डेबियन के तहत या तो आप उपयोग कर सकते हैं a2enmodया से एक प्रतीकात्मक कड़ी बनाने /etc/apache2/mods-available/headers.loadके लिए /etc/apache2/mods-enabled/headers.load
स्किप्पी ले ग्रांड गौरौ जूल

21

यह .htaccessमेरी वास्तविक वेबसाइट में उपयोग किया गया सर्वश्रेष्ठ है :

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
एक .htaccess फ़ाइल का लगभग सही उदाहरण ... यह पूरा हो जाएगा यदि विशिष्ट चित्र शामिल किए गए हों और छवि का पथ कैसे लिखें और कहां .htaccess फ़ाइल (जैसे। छवि dir या अनुक्रमणिका dir में रखें)? .eg। '<IfModule mod_headers.c> <files /img/myimage.jpg> हैडर ने कैश-कंट्रोल "अधिकतम आयु = 3600, को संशोधित करना चाहिए" </ फ़ाइलें> </ ifmodor>' ... क्या यह काम करेगा? ..? । OR ... या img को dir '<filesmatch "^ (उदाहरण \ .jpg | नमूना_। Png) $"> हैडर सेट कैश-कंट्रोल "अधिकतम-आयु = 31536000, सार्वजनिक" </ filesmatch>' पर चिपकाया गया। एक ही रणनीति सभी जोखिम भरा लगता है - वैसे भी विशिष्ट उदाहरण अगर
कब्जे में

2
सिर्फ FYI करें: JS और CSS फाइलों पर gzip कम्प्रेशन आपके SSL एन्क्रिप्शन को तोड़ने में मदद कर सकता है। यदि आप सुरक्षा पर भरोसा करते हैं, तो gzip को चालू न करें
Eduard Void

1
यह लॉगिन खाता पृष्ठ को कैशिंग कर रहा है, इसलिए आप अपने खाते से लॉग आउट नहीं कर सकते। इससे भी बुरी बात यह है कि कोई व्यक्ति खाता पृष्ठ तक नहीं पहुंच सकता है और अंतिम उपयोगकर्ताओं के लॉगिन से लॉग इन किया जा सकता है। ईकामर्स साइट पर उपयोग करने की सलाह नहीं दी जाती है, आपको तब <filesMatch "\.(x?html?|php)$">स्थिर HTML पृष्ठों से बचने के लिए हटा दिया जाना चाहिए । बाकी का फिल्मांकन ठीक है।
nicoX

1
आपने नकल की है <filesmatch "\.(eot|woff|otf|ttf|svg)$">
nicoX

2
यदि आपके पास प्रॉक्सी कैशिंग है तो आप सेट करें cssऔर jsनिजी करें। मुझे आपके लिंक के संबंध में कोई सिफारिश नहीं मिली। अधिकांश CDN आपको उन मूल्यों को कैश करने की सलाह दे रहे हैं।
nicoX

14

अपाचे सर्वर के लिए, आपको एक्सपायर और कैश-कंट्रोल हेडर सेट करने के लिए mod_expires की जांच करनी चाहिए ।

वैकल्पिक रूप से, आप अपने आप में कैश-कंट्रोल जोड़ने के लिए हैडर के निर्देश का उपयोग कर सकते हैं :

Header set Cache-Control "max-age=290304000, public"

5

मेटा कैश कंट्रोल टैग वेब प्रकाशकों को यह परिभाषित करने की अनुमति देता है कि पेज को कैसे कैश द्वारा संभाला जाना चाहिए। उनमें यह घोषित करने के निर्देश शामिल हैं कि क्या उपलब्ध होना चाहिए, क्या कैश द्वारा संग्रहीत किया जा सकता है, समाप्ति तंत्र के संशोधन, और अमान्य और पुनः लोड नियंत्रण।

अनुमत मान हैं:

सार्वजनिक - सार्वजनिक साझा कैश में कैश किया जा सकता है
निजी - केवल कैश में कैश कैश
किया जा सकता है कैश
नहीं - कैश नहीं स्टोर किया जा सकता है - कैश नहीं किया जा सकता है लेकिन संग्रहीत नहीं किया जा सकता है

कृपया मामले की संवेदनशीलता के बारे में सावधान रहें। अपने वेबपेज के स्रोत में निम्नलिखित मेटा टैग जोड़ें। टैग के अंत में वर्तनी में अंतर या तो आप "/> = xml या"> = html का उपयोग करते हैं।

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

सोर्स- > मेटाटैग्स


सुधार: किसी भी स्टोर को कैश नहीं किया जाना चाहिए, किसी भी कैश को कैश करने की अनुमति नहीं है, लेकिन आरक्षित होने से पहले सर्वर के साथ चेक किया जाना चाहिए - देखें palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangmanMouse

कैश-कंट्रोल नो-स्टोर - नो-स्टोर नो-कैश के समान है जिसमें प्रतिक्रिया को कैश नहीं किया जा सकता है और फिर से उपयोग किया जा सकता है, हालांकि एक महत्वपूर्ण अंतर है। नो-स्टोर को संसाधन की आवश्यकता होती है और हर बार मूल सर्वर से डाउनलोड किया जाता है। निजी जानकारी के साथ काम करते समय यह एक महत्वपूर्ण विशेषता है।
मार्कोज़ेन

5

OWASP निम्नलिखित की सिफारिश करता है,

जब भी संभव हो कैश-कंट्रोल HTTP हेडर को नो-कैश, नो-स्टोर, मस्ट-रिवाइल्ड, प्राइवेट के साथ सेट किया गया है; और यह कि प्राग्म HTTP हेडर नो कैश के साथ सेट किया गया है।

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.