การตั้งค่าหมดอายุส่วนหัวสำหรับเนื้อหาคงที่แสดงจาก nginx


96

ฉันใช้ nginx กับเซิร์ฟเวอร์เนื้อหาคงที่ของฉันมีวิธีที่ฉันสามารถตั้งค่าส่วนหัวหมดอายุสำหรับทุกไฟล์ที่ตรงกับกฎเฉพาะหรือไม่ ตัวอย่างเช่นฉันสามารถตั้งค่าส่วนหัวหมดอายุสำหรับไฟล์ทั้งหมดที่มีนามสกุลเป็น '.css' ได้หรือไม่

คำตอบ:


126

ฉันชอบที่จะทำส่วนหัวแคชที่สมบูรณ์ยิ่งขึ้นนอกเหนือจากนามสกุลไฟล์บางส่วนเพิ่มเติม The '?' คำนำหน้าเป็นเครื่องหมาย 'ที่ไม่ได้ดักจับ' nginx จะไม่สร้าง $ 1 ช่วยลดภาระที่ไม่จำเป็น

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

7
ไม่พบไฟล์สแตติกของฉันทั้งหมดหลังจากเพิ่มไฟล์นั้น
Jürgen Paul

@ JackSpairow: ฉันไม่สามารถอธิบายได้ว่าทำไมมันถึงเกิดขึ้นเพราะมันใช้ได้ผลกับฉันเสมอ คุณกำลังเรียกใช้ Nginx ไม่มีโมดูล add_header ให้หรือไม่ สิ่งนี้มีขอบเขต จำกัด จริง ๆ คุณแน่ใจหรือไม่ว่าการชะลอตัวอื่นไม่มีปัญหาในการรวมกัน?
JM Becker

24
อาจเป็นบล็อกอื่นที่มีคำจำกัดความสำหรับไฟล์คงที่พร้อมrootชุดในกรณีนั้นคุณควรเพิ่มคำสั่งในบล็อกนั้น (ฉันรู้ว่านี่สาย 2y แต่สำหรับพลเมืองในอนาคต)
aularon

1
ฉันเองขอขอบคุณการชี้แจงโดยเฉพาะอย่างยิ่งสำหรับผู้ค้นหาในอนาคตเพราะพวกเขามักจะปรากฏขึ้นนานหลังจากโพสต์ต้นฉบับ +1: P
JM Becker

การใช้ทั้งหมดนี้ทำให้เว็บไซต์ WordPress ของฉันยุ่งมาก css และรูปภาพไม่แสดง มีความขัดแย้งอื่นอีกไหม?
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 สำหรับการทำให้สิ่งนี้สามารถใช้ซ้ำ.confได้ โฟลเดอร์ที่เหมาะสมน่าจะเป็นnginx/1.14.0 (Ubuntu) /etc/nginx/snippets/
Jan Werkhoven

9

นอกจากนี้คุณยังสามารถตั้งค่าการหมดอายุสูงสุด นี่คือคำสั่งที่ฉันใช้สำหรับ css และ js

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

1
ฉันจะใช้คำสั่งรูทเฉพาะในเซิร์ฟเวอร์ {} บล็อกเมื่อใช้ในตำแหน่งย่อยมันจะนำไปสู่ผลที่ไม่คาดคิด คุณไม่ต้องการพัก อย่างใดอย่างหนึ่งตามที่คุณไม่ได้อยู่ในบล็อกถ้า {}
เดฟเชนีย์

คุณพูดถูก ลืมทำความสะอาด แก้ไขเพื่อสะท้อนสิ่งนี้
Jauder Ho

4

โซลูชันดังกล่าวทั้งหมดจะปฏิเสธความเป็นไปได้ที่จะมีชื่อแทนที่แตกต่างกันสำหรับเส้นทางที่แตกต่างกัน นอกจากนี้เพื่อให้มีการหมดอายุแคชที่แตกต่างกันทั้งหมดของคุณในที่เดียวคุณควรใช้แผนที่ nginx ในวิธีต่อไปนี้

...

# 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(สำหรับ unix epoch) ส่งผลให้ทรัพยากรถูกเรียกคืนเสมอmaxตั้งค่าวันที่เป็นค่าสูงสุดของเบราว์เซอร์

ภาพ ~ / จับคู่ภาพทุกประเภท

เพิ่มเติมเกี่ยวกับแผนที่ Nginx ที่http://nginx.org/en/docs/http/ngx_http_map_module.html


โปรดทราบว่าถ้า$sent_http_content_typeเป็น"text/css;charset=UTF-8"การแสดงออกดังกล่าวข้างต้นจะล้มเหลว
pachanka

2

หากคุณมีสถานที่แห่งหนึ่งซึ่งเป็นที่ตั้งของไฟล์สแตติกทั้งหมดสิ่งนี้จะทำ ...

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

คำตอบที่ยอมรับทำให้ nginx ไม่พบไฟล์คงที่ของฉัน ไม่แน่ใจจริงๆว่าทำไม แต่นี่เป็นทางเลือกที่ง่าย


ฉันลงคะแนนให้อันนี้ แต่ให้แน่ใจว่าคุณเพิ่ม/staticโฟลเดอร์ (สิ่งที่คุณตั้งไว้ในสถานที่) ในตอนท้ายของนามแฝง (หลังจาก.../filesตัวอย่าง)
Miro J.

-1

เนื่องจากนี่เป็นเธรดที่เก่ามากและฉันได้พบกับบทช่วยสอนที่น่าทึ่งล่าสุด

บางทีคุณต้องการตรวจสอบ

วิธีการนำเบราว์เซอร์แคชไปใช้กับโมดูลส่วนหัวของ Nginx บน Ubuntu 16.04


1
โดยทั่วไปเราหน้าบึ้งเมื่อเชื่อมโยงไปยังบทความและไม่รวมเนื้อหาที่นี่เช่นกันเนื่องจากลิงก์มีแนวโน้มที่จะเปลี่ยนแปลงหรือหมดอายุ
Unkwntech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.