web-dev-qa-db-fra.com

Le paramètre expire les en-têtes pour le contenu statique servi à partir de nginx

J'utilise nginx pour mettre en serveur mon contenu statique, existe-t-il un moyen de définir les en-têtes expirés pour chaque fichier répondant à une règle spécifique? Par exemple, puis-je définir l'en-tête expires pour tous les fichiers qui ont une extension ".css"?

101
Unkwntech

Je préfère faire un en-tête de cache plus complet, en plus de quelques extensions de fichier supplémentaires. Le '?' le préfixe est une marque "non capturante", nginx ne créera pas un $ 1. Il aide à réduire la charge inutile.

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

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

La directive location

La directive expires

22
Dave Cheney

Je n'ai pas assez de réputation pour expliquer pourquoi la réponse acceptée empêcherait les fichiers de s'afficher, mais je l'ai compris et j'aimerais aider!

Version courte:

Assurez-vous d'avoir un répertoire racine spécifié pour votre bloc d'emplacement sur les images si vous n'en avez pas un ensemble global!

Version longue ci-dessous:


Tout d'abord, ma méthode de mise en œuvre de cette solution était vraiment similaire à cette réponse , où vous écrivez la règle (comme dans la réponse acceptée):

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

dans un fichier img-cache.conf

puis incluez ce fichier dans votre server {...} directive.

Mon exemple de somesite.com dans mon dossier sites disponibles:

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

De cette façon, vous pouvez ajouter le bloc d'emplacement de mise en cache d'image à plusieurs sites que vous exécutez.


Deuxièmement, j'ai une situation où mon/var/www/contient deux dossiers que j'autorise en tant que public_html - sécurisé et de formation, donc je dois faire des blocs d'emplacement spécifiques dans la directive serveur de mon site en distinguant ces dossiers.

En tant que tel, Je n'ai pas de répertoire racine global .

Ainsi, lorsque vous créez vos blocs d'emplacement d'image, , vous ne leur fournissez peut-être pas de répertoire racine à partir duquel rechercher les images!

Ma solution était alors de:

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;
}
19
amurrell

Vous pouvez également définir les expirations au maximum. Voici la directive que j'utilise pour css et js.

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

Toutes les solutions susmentionnées nieront la possibilité d'avoir différents alias pour différents chemins. Aussi pour avoir toutes vos différentes expirations de cache en un seul endroit, vous devez utiliser la carte nginx de la manière suivante.

...

# 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 désactive la mise en cache, Epoch (pour Unix Epoch) entraîne la récupération permanente de la ressource, max définit la date sur la valeur maximale du navigateur.

Le ~ image/correspond à tous les types d'images.

Plus d'informations sur les cartes nginx sur http://nginx.org/en/docs/http/ngx_http_map_module.html .

4
Pantura

Si vous avez un endroit qui abrite tous vos fichiers statiques, quelque chose comme ça fera l'affaire ...

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

La réponse acceptée a empêché nginx de trouver aucun de mes fichiers statiques. Je ne sais pas vraiment pourquoi, mais c'est une alternative simple.

2
user161646