Grüße,Ruby on Rails, wie zu deaktivieren/deaktivieren ETag
Wie schalte ich ETag (s) in Ruby on Rails v2.3.5
Wenn ich eine direkte Anfrage an auf die RoR/Mongrel ein ETag Header ist vorhanden.
TIA,
-Daniel
Grüße,Ruby on Rails, wie zu deaktivieren/deaktivieren ETag
Wie schalte ich ETag (s) in Ruby on Rails v2.3.5
Wenn ich eine direkte Anfrage an auf die RoR/Mongrel ein ETag Header ist vorhanden.
TIA,
-Daniel
viel einfacher:
config.middleware.delete Rack::ETag
Ich glaube nicht, dass sie standardmäßig aktiviert sind.
Mein Verständnis ist, dass sie explizit mit veraltetem?/Fresh_when Anruf oder ähnlichem festgelegt werden müssen.
Ich habe den Controller überprüft, es gibt keinen bedingten Code. -daniel – Daniel
Ja, tut es auch (Im mit dünn) ....nie bemerkt, dass vor –
Es gibt eine etag
Setter-Methode auf das ActionController::Response
Objekt, das die ETag HTTP-Header löscht, wenn es leer ist, so dass Sie nur in der Lage sein sollten, es in Ihrem Controller (in einem vor dem Filter wahrscheinlich) zu löschen:
response.etag = nil
ja, aber ich muss es für alle Antworten tun, während ich es für jeden Controller tun konnte, das würde nach einer Weile langweilig und fehleranfällig sein. Was, wenn jemand einen verpasst? – Daniel
Warum nicht ein before_filter in Ihrem Anwendungscontroller hinzufügen, der etag auf null setzt?
Ich würde es vorziehen, nicht mehr als 30 Controller einstellen zu müssen und auch sicherzustellen, dass jeder es in der Zukunft richtig macht. :) – Daniel
Wenn Sie den before_filter in Ihren application_controller setzen, wird er für alle Controller ausgeführt, und wenn Sie aus irgendeinem Grund einen Controller haben, der Etags generieren muss, verwenden Sie skip_before_filter. – Kris
Putting response.etag = nil
in einem Before_filter funktioniert nicht. Das Etag wird erzeugt, kurz bevor die Antwort gesendet wird (es wird vom Körper berechnet, nachdem das gesamte Rendering durchgeführt wurde).
Die richtige Abhilfe etag Nutzung und Erzeugung zu deaktivieren (und so die Zeit verbringen in md5 speichern) es dieser Affe Patch:
module ActionController
class Request
# never match any incomming etag
def etag_matches?(etag)
false
end
end
class Response
# fake rails that our response already has an etag set and so none is generated automatically
def etag?
true
end
end
end
ich in Rails arbeite 4 auf WEBrick versuchen, eine Antwort auf den Cache zu erhalten, bis sie zu einer bestimmten Zeit jeden Tag abläuft. Es sieht so aus, als ob der automatisch erzeugte ETag den Ablaufcache stört, weshalb ich nach dieser Antwort gesucht habe. Ich habe hier nichts hilfreiches gefunden, aber ich habe mein Problem gelöst, also werde ich es teilen.
tl; dr Set der Last-Modified
Kopf
Aber es zu dem, was einstellen? In meiner Situation habe ich versucht, einen Webservice zu optimieren, der die Ergebnisse eines Prozesses liefert, der jeden Tag zur selben Zeit läuft. Meine Antwort-Header am Ende wie folgt aussehen:
response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified
Zuerst wollen die Cache-Control
Header explizit schreiben zu überschreiben, was die Standardeinstellung ist. Ich habe 24 Stunden eingestellt, um mit dem Maximum meines Verfalls-Headers übereinzustimmen. Ich habe den Ablauf-Header mit einer Funktion, die in etwa so aussieht:
def getCacheTime
now = Time.now.utc
cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
if now > cacheTime
cacheTime = cacheTime + (60 * 60 * 24)
end
cacheTime.httpdate
end
Die Getlastmodified Funktion gibt genau 24 Stunden weniger als die getCacheTime Funktion. Es sieht so aus, als würde das Setzen von ETag (ein weiterer Validierungs-Caching-Header) zumindest in meiner aktuellen Entwicklungsumgebung unterdrückt.
Funktioniert das für Rails 2.3 (wie vom OP gefragt) oder ist es nur Rails-3? – tokland
In welcher Datei würde das gehen? Funktioniert es noch in Schienen 4? – Philip7899
Dies war möglicherweise die hilfreichste Antwort, die ich auf SO gesehen habe. – Philip7899