Ruby on Rails, wie zu deaktivieren / deaktivieren ETag
-
21-09-2019 - |
Frage
Grüße,
Wie schalte ich ETag (s) in Ruby on Rails v2.3.5
offWenn ich eine direkte Anfrage tun, um auf die RoR / Mischlings ein ETag-Header vorhanden ist.
TIA,
-Daniel
Lösung
viel einfacher:
config.middleware.delete Rack::ETag
Andere Tipps
Putting response.etag = nil
in einem before_filter funktioniert nicht. Der ETAG erzeugt kurz vor der Antwort ist send (es aus dem Körper caluculated ist so schließlich Rendering getan wurde).
Die richtige Abhilfe zu deaktivieren etag Nutzung und Erzeugung (und so speichern Sie die Zeit verbringen in md5) 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
Es gibt eine etag
Setter-Methode auf dem ActionController::Response
Objekt, das lösche die ETag HTTP-Header, wenn es leer ist, so sollten Sie nur in der Lage sein, es in Ihrem Controller (in einem vor dem Filter wahrscheinlich) zu löschen:
response.etag = nil
Ich glaube nicht, dass sie standardmäßig aktiviert ist.
Mein Verständnis ist, dass sie müssen explizit festgelegt werden mit abgestanden? / Fresh_when Anruf oder ähnlichem.
Ich arbeite in Rails 4 auf WEBrick, versucht, eine Antwort auf Cache zu erhalten, bis sie zu einem bestimmten Zeitpunkt jeden Tag abläuft. Es sieht aus wie die automatisch generierte ETag wird mit dem Ablauf Cache zu stören, weshalb ich für diese Antwort gesucht. Ich habe nichts hilfreich finden Sie hier, aber ich habe mein Problem zu lösen, so dass ich teilen.
tl; dr Set der Last-Modified
Header
Aber stellen Sie es auf, was? In meiner Situation habe ich versucht, einen Web-Service zu optimieren, dass die Ergebnisse eines Prozesses, der läuft zur gleichen Zeit jeden Tag zurückgegeben. Meine Antwort-Header am Ende aussehen wie folgt aus:
response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified
Als erstes möchte Sie ausdrücklich Cache-Control
Header zu überschreiben schreiben, was auch immer die Standardeinstellung. Ich habe mein 24 Stunden zu sein mit dem Maximum meines Ablauf Header übereinstimmen. 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 scheint, dass diese Einstellung die ETag (eine weitere Validierung Caching-Header) zumindest in meiner aktuellen Entwicklungsumgebung unterdrücken.
Warum nicht einen before_filter in Ihrer Anwendung Controller die Sätze etag auf Null?
hinzufügen