Ubuntu -> Apache -> Phusion Passenger -> Rails 2.3
Der Hauptteil meiner Website reagiert auf Ihre Klicks. Wenn Sie also auf einen Link klicken, werden Sie zum Ziel weitergeleitet und Ihre Seite wird sofort neu generiert.
Wenn Sie jedoch auf die Schaltfläche "Zurück" klicken, wird die neue Seite nicht angezeigt. Leider wird es nicht ohne manuelle Aktualisierung angezeigt. Es scheint, dass der Browser es zwischenspeichert. Ich möchte sicherstellen, dass der Browser die Seite nicht zwischenspeichert.
Getrennt davon wurde ich tun möchte weit Zukunft Ablaufdaten für alle meine statische Vermögenswerte setzen.
Was ist der beste Weg, um dies zu lösen? Soll ich das in Rails lösen? Apache? Javascript?
Danke für all deine Hilfe, Jason
Ach. Keiner dieser Vorschläge hat das gesuchte Verhalten erzwungen.
Vielleicht gibt es eine Javascript-Antwort? Ich könnte Rails einen Zeitstempel in einen Kommentar schreiben lassen und dann das Javascript überprüfen lassen, um festzustellen, ob die Zeiten innerhalb von fünf Sekunden liegen (oder was auch immer funktioniert). Wenn ja, dann gut, aber wenn nein, dann die Seite neu laden?
Glaubst du, das würde funktionieren?
Danke für deine Hilfe,
Jason
quelle
Cache-Control: no-store
solange der Browser mit HTTP 1.1 kompatibel ist. Abschnitt 14.9.2 Was von Caches gespeichert werden kannverwenden:
http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-expires_now
quelle
expires_now
sendet nur denno-cache
Header. Je nach Browser reicht dies möglicherweise nicht aus. (Zum Beispiel will Firefox eineno-store
für Nicht-HTTPS-Verbindungen: developer.mozilla.org/en/docs/Using_Firefox_1.5_caching )no-store
wird ebenfalls benötigt.Ich habe diese Linie mit einigem Erfolg in der Steuerung verwendet. Es funktioniert in Safari und Internet Explorer, aber ich habe nicht gesehen, dass es mit Firefox funktioniert.
Für Ihren zweiten Punkt, wenn Sie die Rails-Hilfsmethoden wie verwenden
Wenn Sie die Standardeinstellungen auf Ihrem Webserver belassen, werden die Assets normalerweise recht gut zwischengespeichert.
quelle
1.year.ago
ist unnötiger Aufwand.Fri, 01 Jan 1990 00:00:00 GMT
Der sauberere Weg wäre, eine Rack-Middleware zu schreiben, die den Cache-Control-Header basierend auf einer Logik ändert (zum Beispiel nur für den MIME-Typ application / xml). Für einen hässlicheren, aber immer noch funktionierenden Ansatz könnte die Konstante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL in 'no-cache' geändert werden. Wenn die Controller- und / oder Aktionsgranularität erforderlich ist, ist es natürlich besser, dies im Controller zu tun.
quelle
Hinweis: Sie können den Cache nicht bedingt leeren (z. B. wenn a
before_filter
nur aufruft,reset_cache
wenn der Benutzer bereits dort war). Sie müssen den Cache bedingungslos leeren, da der Browser keine neue Anforderung stellt, nur um festzustellen, ob er diesmal neu geladen werden muss, obwohl dies nicht das letzte Mal erforderlich war.Beispiel:
funktioniert nicht, um zu verhindern, dass Benutzer zurückkehren, nachdem sie dort waren, da der Browser die ursprünglichen Cache-Header auf der Schaltfläche Zurück verwendet.
funktioniert jedoch (nachdem Sie die Seite aktualisiert und den Cache gelöscht haben, bevor Sie dies hinzugefügt haben, offensichtlich), da der Browser bei der ersten Anforderung das abruft
no-cache, no-store, ...
und es auf zukünftige Seitenladevorgänge anwendet.quelle
no_cache_control
Juwel.Wenn Sie dies für alle Antworten tun müssen, z. B. um einen Penetrationstest (BURP, Detectify usw.) zu bestehen, können Sie diesen Gem on Rails 4+ installieren, um allen Antworten die folgenden Header hinzuzufügen:
Funktioniert wie ein Zauber und ist wirklich der richtige Weg für sichere HTTPS-Webanwendungen, für die eine Authentifizierung erforderlich ist.
quelle