113 votes

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

J'utilise nginx pour héberger mon contenu statique. Existe-t-il un moyen de définir les en-têtes d'expiration pour chaque fichier qui répond à une règle spécifique ? Par exemple, puis-je définir l'en-tête d'expiration pour tous les fichiers dont l'extension est '.css' ?

143voto

Kluyg Points 101

Je préfère faire un en-tête de cache plus complet, en plus de quelques extensions de fichiers supplémentaires. Le préfixe '?' est une marque de 'non-capture', 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";
}

24voto

Dave Cheney Points 18132
server {
    ...

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

El location directive

El expires directive

23voto

amurrell Points 581

Je n'ai pas assez de réputation pour expliquer pourquoi la réponse acceptée fait que les fichiers ne s'affichent plus, mais j'ai trouvé la solution et j'aimerais vous aider !

Version courte :

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

Version longue ci-dessous :


Tout d'abord, ma méthode pour mettre en œuvre 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 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;

Ainsi, vous pouvez ajouter le bloc d'emplacement de mise en cache des images à plusieurs sites que vous pourriez exploiter.


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, et je dois donc créer des blocs d'emplacement spécifiques dans la directive du serveur de mon site en distinguant ces dossiers.

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

Donc quand vous faites vos blocs d'emplacement d'image, vous ne leur fournissez peut-être pas un répertoire racine à partir desquels il faut chercher les images dans !

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

12voto

Pantura Points 81

Toutes les solutions susmentionnées refusent la possibilité d'avoir des alias différents pour des chemins différents. De plus, pour avoir toutes vos expirations de cache en un seul 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;
   }
...
}

Off désactive la mise en cache, epoch (pour unix epoch) a pour résultat que la ressource est toujours remise à zéro, max fixe la date à la valeur maximale du navigateur.

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

Pour en savoir plus sur les cartes nginx, voir http://nginx.org/en/docs/http/ngx_http_map_module.html .

10voto

Matt Blaine Points 2270

Vous pouvez également régler 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;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X