2009-05-16 15 views
7

Nie mogę uzyskać nginx, aby ustawić wygasanie nagłówków moich zasobów statycznych w mojej aplikacji Rails.Ustawienie nginx nie powoduje wygaśnięcia nagłówków dla zasobów statycznych Railsy

Moja aplikacja jest wdrażana przy użyciu usługi Phusion Passenger & nginx.

Poniżej jest dana sekcja mojego pliku konfiguracyjnym 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; 
     } 
} 

Nie jestem pewien, dlaczego jej nie ustawienie wygasa nagłówki na moich aktywów statycznych (np /images/foo.png?123456)

nie jestem pewien, czy to ma coś wspólnego z pasażerem czy moja lokalizacja regexp tylko isnt połowu

Odpowiedz

5

Więc znalazłem rozwiązanie. Moje regexp było trochę nieaktualne, ponieważ nie brałem pod uwagę możliwości, że znacznik czasu nie istnieje.

To wyrażenie wyliczyło dla mnie.

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

To wprowadza w błąd.lokalizacja nie będzie pasować do parametru zapytania, więc w rzeczywistości jest to zasób pasujący/all/image, css, js na liście, niezależnie od parametru zapytania dotyczącego pomijania pamięci podręcznej. Jest to niepożądane dla wielu osób. – raggi

0

Może to pomoże:

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

Przeczytaj również how Nginx evaluates location. Czy na pewno nie masz innego ciągu location w pliku konfiguracyjnym, który pasuje do zasobów statycznych przed wykonaniem regexp location?

BTW, należy rozważyć użycie try_files zamiast if (-f $document_root/...).

+0

nie, to jest mój bieżący plik konfiguracyjny. nie ma innych dyrektyw dotyczących lokalizacji. Spróbuję Twojego wyrażeń regularnych i zobaczę, czy ustawia nagłówki. Ponadto nie jestem pewien, dlaczego zaleca się stosowanie try_files zamiast flagi -f. Dlaczego/jak try_files i ulepszenie w tym przypadku? – cpjolicoeur

+0

Nie jestem pewien, ale Igor (autor) zawsze zaleca używanie try_files, gdy ludzie pytają o przepisanie na liście mailingowej Nginx. Dyrektywa "if (-f ...)" może być przetwarzana wolniej, ale nigdy nie eksperymentowałem, aby to wypróbować. – Jasiu

10

Chciałem tylko podkreślić, że co datownik opcja jest zły pomysł - jeśli nie jest włączone, a następnie ustawienie expires max jest nie tak jak nie byłoby sposobem na odświeżenie pliku.

Ponadto, dyrektywa location w Nginx nie może zobaczyć ciągu zapytania, więc zamieszczone tu rozwiązanie nigdy nie pasuje do "opcjonalnego" znacznika czasu.

Prawidłowe rozwiązanie (to znaczy taki, który wysyła maksymalnie wygasa dopiero, gdy plik został poproszony o datownik) byłoby:

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

Jeżeli timestamp nie jest określony, to polegać na Last-Modified i ETag, które są obsługiwane automatycznie przez Nginx.

+0

Usunąłem 'if', ponieważ żadne zasoby przywoływane przez CSS nie miałyby znacznika czasu. –

+0

Zobacz pierwszy akapit mojej odpowiedzi na pytanie, dlaczego to naprawdę zły pomysł. Powinieneś dołączać znaczniki czasu do swoich zasobów przywoływanych przez Twój CSS. Na przykład: https://github.com/djanowski/collage/blob/master/lib/collage.rb#L135-142 – djanowski

0

nie ma potrzeby używania dyrektywy "break", ale access_log off; będzie przydatny:

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

można zobaczyć pełny plik konfiguracyjny na github: https://gist.github.com/711913

Powiązane problemy