2009-05-16 12 views
7

Non riesco a ottenere nginx per impostare le intestazioni di scadenza sulle mie risorse statiche nella mia app Rails.nginx non impostazione scade intestazioni sulle risorse statiche di Rails

La mia app è distribuita utilizzando Phusion Passenger & nginx.

Di seguito si riporta la relativa sezione del mio file di configurazione nginx

server { 
     listen 80; 
     server_name my.domain.tld; 
     root /home/deploy/my.domain.tld/current/public; 
     passenger_enabled on; 
     access_log off; 

     location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 
       expires max; 
       break; 
     } 

     if (-f $document_root/system/maintenance.html) { 
       rewrite ^(.*)$ /system/maintenance.html break; 
     } 
} 

io non sono sicuro perché la sua non è l'impostazione scade intestazioni sui miei beni statici (per esempio /images/foo.png?123456)

non sono sicuro se ha qualcosa a che fare con passeggero o se la mia posizione regexp solo isnt la cattura è

risposta

5

Così ho finito per trovare la soluzione. Il mio regexp era un po 'fuori, perché non stavo tenendo conto della possibilità che il? Timestamp non esistesse.

Questo regexp ha funzionato per me.

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ { 
+0

Questo è fuorviante.la posizione non corrisponderà al parametro della query, quindi in realtà ciò corrisponde alle risorse/all/image, css, js nell'elenco, indipendentemente dal parametro della query di busting della cache. Questo è indesiderabile per molte persone. – raggi

0

Forse questo aiuterà:

location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 

Leggere anche how Nginx evaluates location. Sei sicuro di non avere altre stringhe location nel tuo file di configurazione che corrisponde alle tue risorse statiche prima che il tuo regexp location lo faccia?

BTW, considerare l'utilizzo di try_files anziché if (-f $document_root/...).

+0

no, questo è il mio file di configurazione corrente. non ci sono altre direttive di localizzazione. Proverò la tua espressione regolare e vedrò se imposta le intestazioni. Inoltre, non sono sicuro del motivo per cui si consiglia di utilizzare try_files anziché il flag -f. Perché/come sono try_files e miglioramenti in questo caso? – cpjolicoeur

+0

Non ne sono sicuro, ma Igor (l'autore) raccomanda sempre l'uso di try_files quando le persone chiedono informazioni sulle riscritture sulla mailing list di Nginx. La direttiva "if (-f ...)" può essere analizzata più lentamente, ma non ho mai fatto alcun esperimento per provarlo. – Jasiu

10

Volevo solo far notare che, per rendere il timestamp optional è una cattiva idea - se non è incluso, quindi impostando expires max è sbagliato in quanto non ci sarebbe modo di aggiornare la lima.

Inoltre, la direttiva location in Nginx non può vedere la stringa di query, quindi la soluzione pubblicata qui non corrisponde mai al timestamp "opzionale".

una soluzione adeguata (cioè quella che manda al massimo scade solo quando il file è stato richiesto con un timestamp) sarebbe:

location ~* \.(js|css|png|jpg)$ { 
    if ($query_string ~ "^[0-9]+$") { 
    expires max; 
    break; 
    } 
} 

Se il timestamp non è specificato, allora si affidano a Last-Modified e ETag, che sono gestiti automaticamente da Nginx.

+0

Ho rimosso il 'if' dal momento che qualsiasi risorsa a cui fa riferimento CSS non ha il timestamp. –

+0

Vedere il primo paragrafo della mia risposta sul perché è una pessima idea. Dovresti aggiungere data e ora alle tue risorse a cui fai riferimento dal tuo CSS. Ad esempio: https://github.com/djanowski/collage/blob/master/lib/collage.rb#L135-142 – djanowski

0

non è necessario utilizzare la direttiva "break", ma access_log è disattivato; sarà utile:

location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ { 
     access_log off; 
     expires max; 
     add_header Cache-Control public; 
    } 

è possibile visualizzare file completo di configurazione a github: https://gist.github.com/711913

Problemi correlati