Ustawienie wygasa nagłówki dla treści statycznych podawanych z nginx

96

Używam nginx do serwera mojej zawartości statycznej. Czy istnieje sposób na ustawienie nagłówków wygasających dla każdego pliku, który spełnia określoną regułę? Na przykład, czy mogę ustawić nagłówek wygasający dla wszystkich plików, które mają rozszerzenie „.css”?

Unkwntech
źródło

Odpowiedzi:

126

Wolę zrobić pełniejszy nagłówek pamięci podręcznej, oprócz kilku rozszerzeń plików. „?” przedrostek jest znakiem „nie przechwytującym”, nginx nie utworzy 1 $. Pomaga zredukować niepotrzebne obciążenie.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
JM Becker
źródło
7
Po dodaniu tego nie znaleziono wszystkich moich plików statycznych.
Jürgen Paul
@JackSpairow: Naprawdę nie potrafię wyjaśnić, dlaczego tak się stało, ponieważ zawsze działało to dla mnie. Czy używasz Nginx z brakującym modułem udostępniającym add_header? Ten rodzaj rzeczy jest naprawdę ograniczony, na pewno inne spowolnienie nie stanowi problemu w połączeniu?
JM Becker
24
Prawdopodobnie inny blok miał definicję plików statycznych z rootzestawem, w takim przypadku należy dodać dyrektywy do tego bloku. (Wiem, że to 2 lata później, ale dla przyszłych obywateli)
aularon
1
Osobiście doceniam wyjaśnienia, szczególnie dla przyszłych wyszukiwarek, ponieważ często pojawiają się długo po oryginalnym poście. +1: P
JM Becker
korzystanie z tego całkowicie psuje moją stronę Wordpress. css i obrazy nie są wyświetlane. czy gdzieś jest jakiś konflikt?
user1641443
22
server {
    ...

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

locationdyrektywa

expiresdyrektywa

Dave Cheney
źródło
17

Nie mam wystarczającej reputacji, aby skomentować, dlaczego zaakceptowana odpowiedź spowodowałaby, że pliki nie będą się już wyświetlać, ale wymyśliłem to i chciałbym pomóc!

Krótka wersja:

Upewnij się, że masz katalog główny dla swojego bloku lokalizacji na obrazach, jeśli nie masz globalnego zestawu!

Długa wersja poniżej:


Przede wszystkim moja metoda implementacji tego rozwiązania była bardzo podobna do tej odpowiedzi , w której piszesz regułę (jak w zaakceptowanej odpowiedzi):

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

do pliku img-cache.conf

a następnie dołącz ten plik do swojej server {...}dyrektywy.

Mój przykład somesite.com w folderze dostępnym na stronach:

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

W ten sposób możesz dodać blok lokalizacji buforowania obrazu do wielu witryn, które mogą być uruchomione.


Po drugie, mam sytuację, w której mój / var / www / zawiera dwa foldery, na które zezwalam jako public_html - bezpieczny i szkoleniowy, więc muszę tworzyć określone bloki lokalizacji w dyrektywie serwera mojej witryny, wyróżniając te foldery.

W związku z tym nie mam globalnego katalogu głównego .

Kiedy tworzysz bloki lokalizacji obrazu, być może nie udostępniasz im katalogu głównego, z którego można szukać obrazów!

Moje rozwiązanie polegało wtedy na:

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;
}
amurrell
źródło
1
+1 za uczynienie tego wielokrotnego użytku .conf. Właściwy folder nginx/1.14.0 (Ubuntu)wydaje się być /etc/nginx/snippets/.
Jan Werkhoven
9

Możesz także ustawić wygasanie na maksimum. Oto dyrektywa, której używam dla css i js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Jauder Ho
źródło
1
Użyłbym dyrektywy roota tylko w bloku server {}, gdy używa się jej w pod lokalizacjach, prowadzi to do nieoczekiwanych konsekwencji. Nie potrzebujesz przerwy; albo, ponieważ nie jesteś w bloku if {}
Dave Cheney
Masz rację. Zapomniałem tego posprzątać. Edytowane, aby to odzwierciedlić.
Jauder Ho
4

Wszystkie wyżej wymienione rozwiązania będą odmawiać możliwości posiadania różnych aliasów dla różnych ścieżek. Również ze względu na posiadanie różnych dat ważności pamięci podręcznej w jednym miejscu, powinieneś użyć mapy nginx w następujący sposób.

...

# 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;
   }
...
}

Offwyłącza buforowanie, epoch(dla epoki uniksowej) powoduje, że zasoby są zawsze ponownie pobierane, maxustawia datę na maksymalną wartość przeglądarki.

~ Image / pasuje do dowolnego typu obrazu.

Więcej informacji na temat map nginx na stronie http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
źródło
Zauważ, że jeśli $sent_http_content_typejest "text/css;charset=UTF-8"powyżej wyrażenie zawiedzie.
pachanka
2

Jeśli masz jedno miejsce, w którym znajdują się wszystkie pliki statyczne, coś takiego zrobi ...

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

Zaakceptowana odpowiedź spowodowała, że ​​nginx nie znalazł żadnego z moich plików statycznych. Nie bardzo wiem dlaczego, ale jest to prosta alternatywa.

użytkownik161646
źródło
Głosowałem za tym, ale pamiętaj, aby dodać /staticfolder (cokolwiek ustawisz w lokalizacji) na końcu aliasu (zaraz po tym .../filesw przykładzie).
Miro J.