Funktioniert Nginx `if_modified_since` nur mit statischen Ressourcen?

7

Ich kann anscheinend nicht genug Dokumentation finden. Ich habe eine App, die einige dynamische Antworten generiert, aber dennoch vom Last-ModifiedHeader profitieren kann - also sende ich sie.

Doch beim Drehen if_modified_since(auf beforepro http://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since ) scheint keinen Einfluss auf nicht-statischen Ressourcen zu haben. ZB PHP, Python Apps.

Liegt das daran, dass Nginx nicht nur meinen Last-ModifiedAntwortheader betrachtet? Weil ich sehen kann, dass sie wie folgt richtig eingestellt zu sein scheinen:

> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT

Oder gibt es etwas Größeres, das ich übersehen habe? Nur neugierig, wie if_modified_sincees umgesetzt wird, verglichen mit dem, wo ich meine Erwartungen setze. Ich nahm an, es würde nur die Antwort-Header betrachten und den Status nach Bedarf überschreiben. Liege ich falsch?

anonymer Feigling
quelle
Betrachtet nginx eine Abfrage mit Argumenten, die standardmäßig zwischengespeichert werden können? Ich weiß, dass dies ein Unterschied bei verschiedenen Caching-Produkten ist, aber ich bin mit Nginx nicht vertraut genug, um das zu wissen.
Cameron Kerr

Antworten:

5

Das Senden von Last-ModifiedHeadern in Ihren App-Antworten ist ein Anfang, aber es scheint, dass Sie If-Modified-Sinceeingehende Anfragen nicht richtig bearbeiten , da Ihre App antworten sollte 304 Not Modifiedund nicht 200 OK. Das Ändern der Direktive für Nginx wirkt sich nur auf Anforderungen aus, die direkt von Nginx bereitgestellt werden, dh statische Ressourcen, es sei denn, Sie konfigurieren sie als Reverse-Proxy-Cache. In diesem Fall können Sie veraltete Antworten zu diesem Header-Wert bereitstellen, da Inhalte für einen bestimmten Zeitraum zwischengespeichert werden, ohne dass Ihre App beeinträchtigt wird. Beim Aktivieren <X>_cache_revalidatewird der If-Modified-SinceHeader verwendet, um den Cache-Inhalt zwischen dem Cache von nginx und Ihrer App nach Ablauf erneut zu <X>validieren (wobei = proxy / fastcgi / scgi / uwsgi).

Xavier Lucas
quelle
Vielen Dank. Diese Zeile klärt meine zugrunde liegende Frage : Changing the directive on nginx only impact requests served directly by nginx i.e. static ressources unless you configure it as a reverse proxy cache. - Beispielsweise wirkt Nginx ohne zusätzliche Konfiguration nicht auf nicht statische Inhalte. VIELEN DANK!
Anonymer Feigling
0

Da Sie in Nginx nichts über Ihre Cache-Konfiguration erwähnt haben, gehe ich davon aus, dass Sie keinen Cache festgelegt haben. Dies würde erklären, warum Ihr If-Modified-SinceHeader keine Auswirkungen auf dynamische Antworten hat.

Wenn es um statische Ressourcen geht, hat Nginx eine sehr einfache Möglichkeit, die Handhabung zu bestimmen If-Modified-Since: Es vergleicht die Zeit im Feld mit der Zeit, zu der die Datei zuletzt geändert wurde. Kein Problem da.

Wenn Sie möchten, dass Nginx dasselbe mit dynamisch generierten Antworten tut, gibt es nichts, mit dem es verglichen werden kann, es sei denn, Sie aktivieren das Caching. Standardmäßig merkt sich Nginx nicht an die Antworten, die es zugestellt hat. Wenn Sie das Caching aktivieren, kann Nginx eine eingehende Anforderung mit einer zuvor gegebenen Antwort vergleichen und somit verwenden If-Modified-Since.

Ich fand diesen Artikel sehr nützlich, um die Details zum Einstellen eines Nginx-Caches zu erfahren.

Louis
quelle