Définition d'en-têtes expirés pour le contenu statique servi par nginx

96

J'utilise nginx pour le serveur de contenu statique. Existe-t-il un moyen de définir les en-têtes d'expiration pour chaque fichier respectant une règle spécifique? Par exemple, puis-je définir l'en-tête Expires pour tous les fichiers portant l'extension ".css"?

Unkwntech
la source

Réponses:

127

Je préfère créer un en-tête de cache plus complet, ainsi que d'autres extensions de fichiers. Le '?' Le préfixe est une marque «non capturante», nginx ne créera pas de $ 1. Cela 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";
}
JM Becker
la source
7
Tous mes fichiers statiques n'ont pas été trouvés après avoir ajouté cela.
Jürgen Paul
@ JackSpairow: Je ne peux pas vraiment expliquer pourquoi c'est arrivé, car cela a toujours fonctionné pour moi. Nginx vous manque-t-il avec le module fournissant add_header? Ce genre de chose est vraiment de portée limitée, vous êtes sûr qu'une autre décélération n'est pas un problème en combinaison?
JM Becker
24
Un autre bloc avait probablement une définition pour les fichiers statiques avec un rootensemble. Dans ce cas, vous devez ajouter les directives à ce bloc. (Je sais que c'est 2y en retard, mais pour les futurs citoyens)
aularon
1
Personnellement, j’apprécie les clarifications, en particulier pour les futurs chercheurs, car elles apparaissent souvent longtemps après le message original. +1: P
JM Becker
en utilisant cela gâche totalement mon site web wordpress. CSS et les images ne sont pas montrer. Y a-t-il un autre conflit quelque part?
user1641443
22
server {
    ...

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

La locationdirective

La expiresdirective

Dave Cheney
la source
17

Je n'ai pas assez de réputation pour dire pourquoi la réponse acceptée ferait en sorte que les fichiers ne s'affichent plus, mais je l'ai compris et je voudrais aider!

Version courte:

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

Version longue ci-dessous:


Tout d'abord, ma méthode d'implémentation 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

et ensuite inclure ce fichier dans votre server {...}directive.

Mon exemple de somesite.com dans mon dossier sites-available:

 #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’images à plusieurs sites que vous exécutez.


Deuxièmement, je suis dans une situation où mon / var / www / contient deux dossiers que j’autorise en tant que public_html - secure et training. Je dois donc créer 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 des blocs d’emplacement d’image, il se peut que vous ne leur fournissiez pas de répertoire racine dans lequel 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;
}
amurrell
la source
1
+1 pour en faire un objet réutilisable .conf. Le dossier approprié nginx/1.14.0 (Ubuntu)semble être /etc/nginx/snippets/.
Jan Werkhoven
9

Vous pouvez également définir l'expiration 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;
}
Jauder Ho
la source
1
J'utiliserais la directive root uniquement dans le bloc server {}. Lorsque vous l'utilisez dans des sous-emplacements, cela entraîne des conséquences inattendues. Vous n'avez pas besoin de pause soit, car vous n'êtes pas dans un bloc if {}
Dave Cheney
Tu as raison. J'ai oublié de nettoyer ça. Edité pour refléter cela.
Jauder Ho
4

Toutes les solutions mentionnées ci-dessus nieront la possibilité d'avoir différents alias pour différents chemins. De même, afin d’avoir toutes vos différentes expirations de cache au même endroit, vous devez utiliser nginx map 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;
   }
...
}

Offdésactive la mise en cache, epoch(pour l'époque unix), la ressource est toujours extraite, maxdéfinit la date sur la valeur maximale du navigateur.

La ~ image / correspond à tous les types d'image.

Pour plus d'informations sur les cartes nginx, visitez http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
la source
Notez que si $sent_http_content_typeest "text/css;charset=UTF-8"l'expression ci-dessus va échouer.
Pachanka
2

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. Vous ne savez pas vraiment pourquoi, mais c'est une alternative simple.

utilisateur161646
la source
J'ai voté pour celui-ci mais assurez-vous d'ajouter le /staticdossier (quel que soit l'emplacement que vous avez défini) à la fin de l'alias (juste après .../filesdans l'exemple).
Miro J.