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' ?
Réponses
Trop de publicités?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";
}
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;
}
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 .
- Réponses précédentes
- Plus de réponses