Ausführen von nginx 1.4.1 unter Ubuntu 12.10
Das Senden muss den Header unter bestimmten Bedingungen und basierend auf dem MIME-Typ / Inhaltstyp der http-Antwort senden.
Dieser einfache Code wurde in location / {hinzugefügt
if ($sent_http_content_type = "text/css") {
expires 7d;
}
Der abgelaufene Header wird nicht gesendet, auch wenn $ sent_http_content_type "text / css" enthält.
Wie kann ich das beheben?
Das Überprüfen von Dateierweiterungen reicht nicht aus, da in meiner App js, css Bilder dynamisch aus PHP generiert werden. Sie müssen also die MIME überprüfen und auch darauf basierend Header hinzufügen.
Antworten:
Ab Nginx 1.7.9:
HINWEIS: $ sent_http_content_type ist gültig, kann jedoch erst aufgerufen werden, wenn der Server die Anforderung verarbeitet hat ...
Die Antwort zeigt auf den Karteneintrag, für
application/pdf
den ein Datumswert zulässig ist oder derapplication/pdf modified +42d
beispielsweise sein könntequelle
Die
if
Direktive in Nginx wird frühzeitig beim Umschreiben verarbeitet, und daher wurde die$sent_http_content_type
Variable 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
expires
scheint die Direktive Variablen nicht auf die gleiche Weise zu unterstützen, wie dies beispielsweise deradd_header
Fall 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
map
und zu verwendenadd_header
, um HTTP-Header manuell festzulegen, anstatt dies derexpires
Direktive zu erlauben. Dies ist weniger flexibel, da derExpires
Header nicht gesetzt wird , aber ich hoffe, dass heutzutage jeder Browser das Richtige tut, wenn er nurCache-Control
gesetzt wird. Hier ist ein Beispiel, das ich kurz getestet habe: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-Control
Headers ü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
location
Direktive wie dieser verwenden können:Dies erleichtert die Nginx-Konfiguration, da Sie die integrierte
expires
Direktive 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.quelle
$ sent_http_content_type ist ungültig. Request - Header - Werte können über $ HTTP_ zugegriffen werden Namen . Für den Header vom Inhaltstyp hat nginx außerdem die Variable $ content_type eingebettet.
Wenn Sie $ content_type mit einer Reihe von Typen vergleichen möchten, ist es besser, map zu verwenden:
Wenn $ test_header als leere Zeichenfolge ausgewertet wird, wird der Header nicht gesetzt.
Weitere Informationen finden Sie unter: http://nginx.org/en/docs/http/ngx_http_core_module.html#variables http://nginx.org/en/docs/http/ngx_http_map_module.html http://nginx.org/ de / docs / http / ngx_http_headers_module.html # add_header
quelle
$content_type
? Dh die Karte könnte einen $ content_type-Wert von 30d oder 1y verwenden und dann könnten Sie diesenlocation /
mit platzierenexpires $test_header
?Wenn Sie den MIME-Typ verwenden müssen, versuchen Sie:
Möglicherweise möchten Sie jedoch Folgendes in Betracht ziehen:
Wir verwenden dies auf einer sehr belebten Website mit sehr guter Wirkung.
quelle