Nginx से सेवा की गई स्थिर सामग्री के लिए हेडर की समय सीमा समाप्त करना


96

मैं अपनी स्थैतिक सामग्री सर्वर पर करने के लिए nginx का उपयोग कर रहा हूं, क्या कोई ऐसा तरीका है जो मैं किसी विशिष्ट नियम को पूरा करने वाली प्रत्येक फ़ाइल के लिए समय सीमा समाप्त करने वाले हेडर सेट कर सकता हूं? उदाहरण के लिए क्या मैं '.css' के एक्सटेंशन वाली सभी फाइलों के लिए एक्सपायर हेडर सेट कर सकता हूँ?

जवाबों:


126

मैं कुछ और फ़ाइल एक्सटेंशन के अलावा, अधिक पूर्ण कैश हेडर करना पसंद करता हूं। '?' उपसर्ग एक 'गैर-कैप्चरिंग' चिह्न है, nginx $ 1 नहीं बनाएगा। यह अनावश्यक भार को कम करने में मदद करता है।

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
मेरी सभी स्टैटिक फाइलें जोड़ने के बाद नहीं मिलीं।
जुरगेन पॉल

@JackSpairow: मैं वास्तव में समझा नहीं सकता कि ऐसा क्यों हुआ, क्योंकि यह हमेशा मेरे लिए काम किया है। क्या आप Nginx में add_header मॉड्यूल प्रदान करने से चूक रहे हैं? इस तरह की बात वास्तव में दायरे में सीमित है, आपको यकीन है कि एक और मंदी संयोजन में कोई समस्या नहीं है?
जेएम बेकर

24
संभवतः एक अन्य ब्लॉक में एक rootसेट के साथ स्थिर फ़ाइलों के लिए परिभाषा थी , उस स्थिति में आपको उस ब्लॉक में निर्देश जोड़ना चाहिए। (मुझे पता है कि यह 2y देर से, लेकिन भविष्य के नागरिकों के लिए है)
aululon

1
मैं व्यक्तिगत रूप से भविष्य के खोजकर्ताओं के लिए स्पष्टीकरण की सराहना करता हूं, क्योंकि वे अक्सर मूल पोस्ट के बाद लंबे समय तक दिखाई देते हैं। +1: पी
जेएम बेकर

यह पूरी तरह से मेरे WordPress वेबसाइट का उपयोग करता है। सीएसएस और छवियों को नहीं दिखाया गया है। कहीं कोई और संघर्ष तो नहीं है?
user1641443


17

मेरे पास इस बात पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है कि स्वीकृत जवाब फाइलों को क्यों नहीं दिखाएगा, लेकिन मुझे यह समझ में आया और वह मदद करना चाहेंगे!

लघु संस्करण:

सुनिश्चित करें कि यदि आपके पास एक वैश्विक सेट नहीं है, तो आप छवियों पर अपने स्थान ब्लॉक के लिए एक रूट निर्देशिका निर्दिष्ट करें!

नीचे लंबा संस्करण:


सबसे पहले, इस समाधान को लागू करने की मेरी विधि वास्तव में इस उत्तर के समान थी , जहां आप नियम लिखते हैं (जैसा कि स्वीकृत उत्तर में है):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

एक फ़ाइल में img-cache.conf

और फिर उस फ़ाइल को अपने server {...}निर्देश में शामिल करें ।

मेरे साइट-उपलब्ध फ़ोल्डर में somesite.com का मेरा उदाहरण:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

इस तरह आप अपने द्वारा चलाए जा रहे कई साइटों पर छवि कैशिंग स्थान ब्लॉक जोड़ सकते हैं।


दूसरी बात, मेरे पास एक ऐसी स्थिति है जहां मेरे / var / www / में दो फ़ोल्डर हैं जिन्हें मैं public_html - सुरक्षित और प्रशिक्षण के रूप में अनुमति देता हूं, इसलिए मुझे अपनी साइट के सर्वर निर्देश इन सिंगल्स को एकल करने के लिए विशिष्ट स्थान ब्लॉक करना होगा।

जैसे, मेरे पास वैश्विक रूट डायरेक्टरी सेट नहीं है

इसलिए जब आप अपनी छवि का स्थान ब्लॉक करते हैं, तो हो सकता है कि आप उन्हें एक रूट डायरेक्टरी प्रदान नहीं कर रहे हों, जिसमें से छवियों को देख सकें !

मेरा समाधान तब था:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
इसे पुन: प्रयोज्य बनाने के लिए +1 .confnginx/1.14.0 (Ubuntu)प्रतीत होता है में उचित फ़ोल्डर /etc/nginx/snippets/
जन वेर्खोवेन

9

आप एक्सपायर को अधिकतम करने के लिए भी सेट कर सकते हैं। यहाँ निर्देश है कि मैं सीएसएस और जेएस के लिए उपयोग करता हूं।

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
मैं रूट डायरेक्टिव का उपयोग केवल सर्वर {} ब्लॉक में करेगा, जब उप स्थानों में इसका उपयोग करते हुए यह अप्रत्याशित परिणाम की ओर ले जाएगा। आपको ब्रेक की आवश्यकता नहीं है; या तो, जैसा कि आप एक {} ब्लॉक में नहीं हैं
डेव चेनी

तुम सही हो। इसे साफ करना भूल गए। इसे प्रतिबिंबित करने के लिए संपादित किया गया।
Jauder Ho

4

सभी उपर्युक्त समाधान अलग-अलग रास्तों के लिए अलग-अलग उपनाम होने की संभावना से इनकार करेंगे। इसके अलावा, एक ही स्थान पर अपने सभी अलग-अलग कैश एक्सपायरी होने के कारण आपको निम्नलिखित तरीके से नग्नेक्स मैप का उपयोग करना चाहिए।

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offकैशिंग अक्षम करता है, epoch(यूनिक्स युग के लिए) संसाधन में परिणाम हमेशा refetched किया जाता है, maxतिथि को अधिकतम मान ब्राउज़र पर सेट करता है।

~ छवि किसी भी छवि प्रकार से मेल खाती है।

Http://nginx.org/en/docs/http/ngx_http_map_module.html पर nginx के नक्शे के बारे में अधिक जानकारी ।


ध्यान दें कि यदि $sent_http_content_typeहै "text/css;charset=UTF-8"ऊपर अभिव्यक्ति असफल हो जायेगी।
पचनाका

2

यदि आपके पास एक ऐसी जगह है जो आपकी सभी स्टैटिक फ़ाइलों का घर है, तो ऐसा कुछ होगा ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

स्वीकृत उत्तर ने मेरी किसी भी स्थिर फाइल को नहीं मिलने के कारण nginx का कारण बना। वास्तव में यकीन नहीं क्यों, लेकिन यह एक सरल विकल्प है।


मैंने इस एक के लिए मतदान किया, लेकिन यह सुनिश्चित करें कि आप /staticउपनाम के अंत में फ़ोल्डर (जो भी आप स्थान पर सेट करते हैं) ( .../filesउदाहरण के ठीक बाद ) जोड़ दें ।
मिरो जे।

-1

चूंकि यह एक बहुत पुराना धागा है, और मुझे अद्भुत ट्यूटोरियल मिल गया।

शायद आप इसे जांचना चाहते हैं

Ubuntu 16.04 पर Nginx के हेडर मॉड्यूल के साथ ब्राउज़र कैशिंग लागू कैसे करें


1
आम तौर पर, हम लेखों को लिंक करने और यहां की सामग्री को शामिल नहीं करने के लिए आगे बढ़ते हैं, साथ ही लिंक को बदलने या समाप्त करने की प्रवृत्ति होती है।
Unwwntech
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.