sviluppo-web-qa.it

L'impostazione scade le intestazioni per il contenuto statico offerto da nginx

Sto usando nginx per server il mio contenuto statico, c'è un modo in cui posso impostare le intestazioni di scadenza per ogni file che soddisfa una regola specifica? Ad esempio, posso impostare l'intestazione di scadenza per tutti i file con estensione ".css"?

101
Unkwntech

Preferisco fare un'intestazione di cache più completa, oltre ad alcune estensioni di file. Il '?' il prefisso è un segno 'non-cattura', nginx non creerà $ 1. Aiuta a ridurre il carico non necessario.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
135
J. M. Becker
server {
    ...

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

La direttiva location

La direttiva expires

22
Dave Cheney

Non ho abbastanza reputazione per commentare il motivo per cui la risposta accettata non causerebbe più la visualizzazione dei file, ma l'ho capito e vorrei dare una mano!

Versione breve:

Assicurati di avere una directory root specificata per il tuo blocco di posizione sulle immagini se non ne hai uno globale!

Versione lunga di seguito:


Innanzitutto, il mio metodo di implementazione di questa soluzione è stato molto simile a questa risposta , in cui scrivi la regola (come nella risposta accettata):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

in un file img-cache.conf

e quindi includi quel file nel tuo server {...} direttiva.

Il mio esempio di somesite.com nella cartella dei miei siti disponibili:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

In questo modo è possibile aggiungere il blocco della posizione della memorizzazione nella cache delle immagini a più siti in esecuzione.


In secondo luogo, ho una situazione in cui my/var/www/contiene due cartelle che consento come public_html: sicure e di formazione, quindi devo creare blocchi di posizione specifici nella direttiva server del mio sito individuando queste cartelle.

Pertanto, non ho un set di directory radice globale .

Quindi quando crei i blocchi di posizione delle tue immagini, potresti non fornire loro una directory radice da cui cercare le immagini!

La mia soluzione era quindi di:

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

È inoltre possibile impostare la scadenza al massimo. Ecco la direttiva che uso per css e js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
9
Jauder Ho

Tutte le soluzioni sopra menzionate negheranno la possibilità di avere alias diversi per percorsi diversi. Inoltre, per avere tutte le diverse scadenze della cache in un unico posto, dovresti usare nginx map nel modo seguente.

...

# 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 disabilita la memorizzazione nella cache, Epoch (per unix Epoch) comporta il recupero della risorsa, max imposta la data sul valore massimo del browser.

L'immagine ~/corrisponde a qualsiasi tipo di immagine.

Maggiori informazioni sulle mappe di nginx su http://nginx.org/en/docs/http/ngx_http_map_module.html .

4
Pantura

Se hai un posto che ospita tutti i tuoi file statici, qualcosa del genere farà ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

La risposta accettata ha fatto sì che nginx non trovasse nessuno dei miei file statici. Non so davvero perché, ma questa è una semplice alternativa.

2
user161646