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