Frage

Grüße,

Wie schalte ich ETag (s) in Ruby on Rails v2.3.5

off

Wenn ich eine direkte Anfrage tun, um auf die RoR / Mischlings ein ETag-Header vorhanden ist.

TIA,

-Daniel

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top