Die ifDirektive in Nginx wird frühzeitig beim Umschreiben verarbeitet, und daher wurde die $sent_http_content_typeVariable noch nicht initialisiert. Weitere Informationen finden Sie in diesem Nginx- Fehlerbericht .
EDIT : Wenn man Benutzernamen vergleicht, könnte dieser Fehlerbericht tatsächlich Sie sein! (^_^)
In ähnlicher Weise expiresscheint die Direktive Variablen nicht auf die gleiche Weise zu unterstützen, wie dies beispielsweise der add_headerFall ist. Da Sie also nicht in der Lage sind, den Speicherort basierend auf Dateierweiterungen statisch anzugeben, kann ich mir nur zwei grundlegende Ansätze vorstellen.
Eine Möglichkeit wäre, den von Vadim oben vorgeschlagenen Ansatz mapund zu verwenden add_header, um HTTP-Header manuell festzulegen, anstatt dies der expiresDirektive zu erlauben. Dies ist weniger flexibel, da der ExpiresHeader nicht gesetzt wird , aber ich hoffe, dass heutzutage jeder Browser das Richtige tut, wenn er nur Cache-Controlgesetzt wird. Hier ist ein Beispiel, das ich kurz getestet habe:
map $sent_http_content_type $cacheable_types {
"text/css" "max-age=864000";
"image/jpeg" "max-age=864000";
default "";
}
# ...
server {
# ...
location / {
# ...
add_header "Cache-Control" $cacheable_types;
}
}
Der Wert 864000 beträgt 10 Tage in Sekunden - Sie müssen ihn nach Belieben ändern. Der Vorteil dieses Ansatzes besteht darin, dass Sie für jeden Dateityp unterschiedliche Zeiten angeben und sogar andere Aspekte des Cache-ControlHeaders überschreiben können. Sie diskutieren diesen Header hier und den offiziellen Teil des HTTP-RFC hier, wenn Sie etwas Formaleres bevorzugen.
Der zweite Ansatz wäre, einfach zu arrangieren, dass Anforderungen, die zu zwischenspeicherbaren Inhalten führen, alle unter einen bestimmten Pfad fallen, den Sie in einer locationDirektive wie dieser verwenden können:
location / {
# ...
location /static {
expires 10d;
}
}
Dies erleichtert die Nginx-Konfiguration, da Sie die integrierte expiresDirektive verwenden können. Ob dies jedoch eine Option ist, hängt stark davon ab, ob Sie dieses URL-Muster in Ihrem Code erzwingen können.