2010-01-19 20 views

Antwort

19

viel einfacher:

config.middleware.delete Rack::ETag 
+1

Funktioniert das für Rails 2.3 (wie vom OP gefragt) oder ist es nur Rails-3? – tokland

+1

In welcher Datei würde das gehen? Funktioniert es noch in Schienen 4? – Philip7899

+0

Dies war möglicherweise die hilfreichste Antwort, die ich auf SO gesehen habe. – Philip7899

0

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.

+0

Ich habe den Controller überprüft, es gibt keinen bedingten Code. -daniel – Daniel

+0

Ja, tut es auch (Im mit dünn) ....nie bemerkt, dass vor –

1

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 
+0

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

-1

Warum nicht ein before_filter in Ihrem Anwendungscontroller hinzufügen, der etag auf null setzt?

+0

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

+1

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

5

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 
0

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.