Das Setzen von Headern für statische Inhalte, die von nginx geliefert werden, läuft ab

96

Ich verwende Nginx, um meinen statischen Inhalt zu speichern. Gibt es eine Möglichkeit, die Ablauf-Header für jede Datei festzulegen, die einer bestimmten Regel entspricht? Kann ich beispielsweise den Expires-Header für alle Dateien mit der Erweiterung ".css" festlegen?

Unkwntech
quelle

Antworten:

126

Ich bevorzuge es, einen vollständigeren Cache-Header zu erstellen, zusätzlich zu einigen weiteren Dateierweiterungen. Das '?' Das Präfix ist eine nicht erfassende Markierung. Nginx erzeugt keine 1 $. Es hilft, unnötige Belastung zu reduzieren.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
JM Becker
quelle
7
Alle meine statischen Dateien wurden nach dem Hinzufügen nicht gefunden.
Jürgen Paul
@ JackSpairow: Ich kann nicht wirklich erklären, warum das passiert ist, da es immer für mich funktioniert hat. Führen Sie Nginx aus, dem das Modul "add_header" fehlt? Diese Art von Dingen ist wirklich in ihrem Umfang begrenzt. Sind Sie sicher, dass eine weitere Verzögerung in Kombination kein Problem darstellt?
JM Becker
24
Wahrscheinlich hatte ein anderer Block eine Definition für die statischen Dateien mit einer rootMenge. In diesem Fall sollten Sie die Direktiven zu diesem Block hinzufügen. (Ich weiß, dies ist 2y spät, aber für zukünftige Bürger)
aularon
1
Ich persönlich schätze Klarstellungen, insbesondere für zukünftige Suchende, da sie oft lange nach dem ursprünglichen Beitrag auftauchen. +1: P
JM Becker
wenn ich das benutze, wird meine WordPress-Website total durcheinander gebracht. CSS und Bilder werden nicht angezeigt. Gibt es irgendwo einen anderen Konflikt?
user1641443
22
server {
    ...

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

Die locationRichtlinie

Die expiresRichtlinie

Dave Cheney
quelle
17

Ich habe nicht genug Ruf, um zu kommentieren, warum die akzeptierte Antwort dazu führen würde, dass die Dateien nicht mehr angezeigt werden, aber ich habe es herausgefunden und möchte helfen!

Kurzfassung:

Stellen Sie sicher, dass Sie ein Stammverzeichnis für Ihren Standortblock auf Bildern angegeben haben, wenn Sie kein globales Verzeichnis festgelegt haben!

Lange Version unten:


Zuallererst war meine Methode zum Implementieren dieser Lösung der folgenden Antwort sehr ähnlich , in der Sie die Regel schreiben (wie in der akzeptierten Antwort):

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

in eine Datei img-cache.conf

und fügen Sie diese Datei dann in Ihre server {...}Direktive ein.

Mein Beispiel für somesite.com in meinem für Websites verfügbaren Ordner:

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

Auf diese Weise können Sie den Image-Caching-Speicherortblock mehreren Sites hinzufügen, die Sie möglicherweise ausführen.


Zweitens habe ich eine Situation, in der mein / var / www / zwei Ordner enthält, die ich als public_html zulasse - sicher und trainierend. Daher muss ich in der Server-Direktive meiner Site bestimmte Standortblöcke erstellen, in denen diese Ordner herausgegriffen werden.

Als solches habe ich kein globales Stammverzeichnis festgelegt .

Wenn Sie also Ihre Image-Speicherorte sperren, stellen Sie ihnen möglicherweise kein Stammverzeichnis zur Verfügung, in dem Sie nach den Images suchen können!

Meine Lösung war dann:

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
quelle
1
+1 dafür, dass dies wiederverwendbar ist .conf. Der entsprechende Ordner in nginx/1.14.0 (Ubuntu)scheint zu sein /etc/nginx/snippets/.
Jan Werkhoven
9

Sie können das Ablaufdatum auch auf Maximum setzen. Hier ist die Direktive, die ich für CSS und JS benutze.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Jauder Ho
quelle
1
Ich würde die root-Direktive nur im server {} -Block verwenden, wenn sie an untergeordneten Standorten verwendet wird, führt dies zu unerwarteten Konsequenzen. Du brauchst die Pause nicht; auch nicht, weil du nicht in einem if {} -Block bist
Dave Cheney
Du hast recht. Ich habe vergessen, das aufzuräumen. Bearbeitet, um dies widerzuspiegeln.
Jauder Ho
4

Alle vorgenannten Lösungen werden die Möglichkeit verweigern, unterschiedliche Aliase für unterschiedliche Pfade zu haben. Um alle Ihre unterschiedlichen Cache-Verfallszeiten an einem Ort zu haben, sollten Sie nginx map auf folgende Weise verwenden.

...

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

OffDeaktiviert die Zwischenspeicherung epoch(für Unix-Epochen), führt dazu, dass die Ressource immer neu abgerufen wird, und maxsetzt das Datum auf den maximalen Wert des Browsers.

Das ~ Bild / entspricht einem beliebigen Bildtyp.

Weitere Informationen zu nginx maps finden Sie unter http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
quelle
Beachten Sie, dass $sent_http_content_typeist "text/css;charset=UTF-8"der obige Ausdruck fehlschlagen.
Pachanka
2

Wenn Sie einen Ort haben, an dem all Ihre statischen Dateien gespeichert sind, ist so etwas ausreichend ...

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

Die akzeptierte Antwort führte dazu, dass nginx keine meiner statischen Dateien fand. Ich weiß nicht genau warum, aber das ist eine einfache Alternative.

user161646
quelle
Ich habe für diesen gestimmt, aber stelle sicher, dass du den /staticOrdner (was auch immer du als Speicherort festgelegt hast) am Ende des Alias hinzufügst (direkt danach .../filesim Beispiel).
Miro J.