Pengaturan tajuk kedaluwarsa untuk konten statis yang disajikan dari nginx

96

Saya menggunakan nginx untuk server konten statis saya, apakah ada cara saya dapat mengatur header kedaluwarsa untuk setiap file yang memenuhi aturan tertentu? Sebagai contoh, dapatkah saya mengatur tajuk kedaluwarsa untuk semua file yang memiliki ekstensi '.css'?

Unkwntech
sumber

Jawaban:

126

Saya lebih suka melakukan header cache yang lebih lengkap, selain beberapa ekstensi file lagi. '?' awalan adalah tanda 'tidak menangkap', nginx tidak akan menghasilkan $ 1. Ini membantu mengurangi beban yang tidak perlu.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
JM Becker
sumber
7
Semua file statis saya tidak ditemukan setelah menambahkan itu.
Jürgen Paul
@ JackSpairow: Saya tidak bisa menjelaskan mengapa itu terjadi, karena selalu berhasil untuk saya. Apakah Anda menjalankan Nginx yang tidak memiliki modul tambahan add_header? Hal semacam ini benar-benar terbatas dalam ruang lingkup, Anda yakin perlambatan lain bukan masalah dalam kombinasi?
JM Becker
24
Mungkin blok lain memiliki definisi untuk file statis dengan satu rootset, dalam hal ini Anda harus menambahkan arahan ke blok itu. (Saya tahu ini sudah terlambat, tetapi untuk warga negara masa depan)
aularon
1
Saya pribadi menghargai klarifikasi, terutama untuk pencari masa depan karena mereka sering muncul lama setelah posting asli. +1: P
JM Becker
menggunakan ini benar-benar mengacaukan situs wordpress saya. css dan gambar tidak ditampilkan. apakah ada konflik lain di suatu tempat?
user1641443
22
server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

The locationdirektif

The expiresdirektif

Dave Cheney
sumber
17

Saya tidak memiliki reputasi yang cukup untuk mengomentari mengapa jawaban yang diterima akan menyebabkan file tidak lagi muncul, tetapi saya menemukan jawabannya dan ingin membantu!

Versi pendek:

Pastikan Anda memiliki direktori root yang ditentukan untuk blok lokasi Anda pada gambar jika Anda tidak memiliki satu set global!

Versi panjang di bawah ini:


Pertama-tama, metode saya untuk mengimplementasikan solusi ini sangat mirip dengan jawaban ini , di mana Anda menulis aturan (seperti pada jawaban yang diterima):

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

ke dalam file img-cache.conf

dan kemudian sertakan file itu ke dalam server {...}arahan Anda .

Contoh saya tentang somesite.com di folder yang tersedia di situs saya:

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

Dengan begitu Anda bisa menambahkan blok lokasi caching gambar ke beberapa situs yang mungkin Anda jalankan.


Kedua, saya memiliki situasi di mana / var / www / saya berisi dua folder yang saya izinkan sebagai public_html - aman dan pelatihan, jadi saya harus membuat blok lokasi spesifik dalam arahan server situs saya yang memilih folder-folder ini.

Karena itu, saya tidak memiliki set direktori root global .

Jadi, ketika Anda membuat blok lokasi gambar Anda , Anda mungkin tidak menyediakan mereka dengan direktori root untuk mencari gambar di dalamnya!

Solusi saya adalah untuk:

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;
}
amurrell
sumber
1
+1 untuk menjadikan ini dapat digunakan kembali .conf. Folder yang sesuai di nginx/1.14.0 (Ubuntu)tampaknya /etc/nginx/snippets/.
Jan Werkhoven
9

Anda juga dapat mengatur kadaluarsa ke maksimum. Berikut adalah arahan yang saya gunakan untuk css dan js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Jauder Ho
sumber
1
Saya akan menggunakan arahan root hanya di blok server {}, ketika menggunakannya di sub lokasi itu mengarah pada konsekuensi yang tidak terduga. Anda tidak perlu istirahat; baik, karena Anda tidak berada dalam blok if {}
Dave Cheney
Kamu benar. Lupa membersihkan ini. Diedit untuk mencerminkan ini.
Jauder Ho
4

Semua solusi yang disebutkan di atas akan menyangkal kemungkinan untuk memiliki alias yang berbeda untuk jalur yang berbeda. Demi memiliki semua kedaluwarsa cache yang berbeda di satu tempat, Anda harus menggunakan peta nginx dengan cara berikut.

...

# 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;
   }
...
}

OffMenonaktifkan caching, epoch(untuk masa unix) menghasilkan sumber daya yang selalu diambil ulang, maxmenetapkan tanggal ke nilai maksimal peramban.

~ Gambar / cocok dengan semua jenis gambar.

Lebih lanjut tentang peta nginx di http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
sumber
Perhatikan bahwa jika $sent_http_content_typeadalah "text/css;charset=UTF-8"ekspresi di atas akan gagal.
pachanka
2

Jika Anda memiliki satu tempat yang merupakan rumah bagi semua file statis Anda, sesuatu seperti ini ...

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

Jawaban yang diterima menyebabkan nginx tidak menemukan file statis saya. Tidak begitu yakin mengapa, tetapi ini adalah alternatif sederhana.

pengguna161646
sumber
Saya memilih yang ini tetapi pastikan Anda menambahkan /staticfolder (apa pun yang Anda atur di lokasi) di akhir alias (tepat setelah .../filesdalam contoh).
Miro J.