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


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"?


85
2018-06-10 07:19


origine




Réponses:


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

112
2017-11-25 21:07



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? - J. M. Becker
Probablement un autre bloc avait la définition pour les fichiers statiques avec un root définir, dans ce cas, vous devez ajouter les directives à ce bloc. (Je sais que c'est 2y en retard, mais pour les futurs citoyens) - aularon
Personnellement, j’apprécie les clarifications, en particulier pour les futurs chercheurs, car elles apparaissent souvent longtemps après le post original. +1: P - J. M. 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


server {
    ...

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

le location directif

le expires directif


21
2018-06-10 07:23





Je n'ai pas assez de réputation pour expliquer pourquoi la réponse acceptée ferait en sorte que les fichiers ne s'affichent plus, mais je l'ai compris et j'aimerais vous 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

puis inclure ce fichier dans votre server {...} directif.

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, mon / var / www / contient deux dossiers que j’autorise comme public_html - secure et training. Je dois donc créer des blocs d’emplacement spécifiques dans la directive de serveur de mon site en distinguant ces dossiers.

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

Alors, quand vous faites vos blocs d'emplacement d'image, vous ne leur fournissez peut-être pas de répertoire racine à partir duquel chercher 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;
}

12
2018-01-31 21:43



+1 pour en faire un objet réutilisable .conf. Le dossier approprié dans nginx/1.14.0 (Ubuntu) semble être /etc/nginx/snippets/. - Jan Werkhoven


Vous pouvez également définir les expires 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
2018-06-10 08:41



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, puisque 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


Toutes les solutions mentionnées ci-dessus nieront la possibilité d'avoir différents alias pour différents chemins. De même, pour que toutes vos différentes expirations de cache se trouvent 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;
   }
...
}

Off désactive la mise en cache, epoch (pour l'époque unix), les ressources sont toujours récupérées, max définit la date sur la valeur maximale du navigateur.

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

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


2
2018-01-04 19:58



Notez que si $sent_http_content_type est "text/css;charset=UTF-8" l'expression ci-dessus va échouer. - pachanka


Si vous avez un endroit qui héberge 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.


0
2018-02-25 03:12





Comme il s’agit d’un très vieux fil de discussion, j’ai trouvé un excellent tutoriel à jour.

Peut-être que vous voulez vérifier

Comment implémenter la mise en cache du navigateur avec le module d’en-tête de Nginx sur Ubuntu 16.04


-1
2018-05-04 04:18



Généralement, nous refusons les liens vers des articles et n'incluons pas non plus le contenu, car les liens ont tendance à changer ou à expirer. - Unkwntech