2010-01-19 23 views

risposta

19

molto più facile:

config.middleware.delete Rack::ETag 
+1

Funziona per Rails 2.3 (come richiesto dall'OP), o è solo Rails-3? – tokland

+1

In quale file dovrebbe andare? Funziona ancora su rotaie 4? – Philip7899

+0

Questa è stata potenzialmente la risposta più utile che ho visto su SO. – Philip7899

0

Non credo che siano per impostazione predefinita.

La mia comprensione è che devono essere impostati esplicitamente utilizzando stantio/nuova_quando chiamata o simile.

+0

Ho controllato il controller non c'è codice di ricezione condizionale. -daniel – Daniel

+0

Sì, lo fa anche io (sto usando sottile) ....mai notato prima di –

1

C'è un metodo etag setter sull'oggetto ActionController::Response, che elimina l'intestazione ETag HTTP se è vuoto, così si dovrebbe solo essere in grado di cancellare nel vostro controller (probabilmente in un prima del filtro):

response.etag = nil 
+0

sì, ma ho bisogno di farlo per tutte le risposte, mentre potrei farlo per ogni controller, che sarebbe noioso dopo un po 'e essere incline agli errori. E se qualcuno ne avesse perso uno? – Daniel

-1

Perché non aggiungere un before_filter nel controller dell'applicazione che imposta etag su zero?

+0

Preferirei non dover aggiustare più di 30 controller e anche assicurarmi che tutti lo impostino correttamente in futuro. :) – Daniel

+1

Se metti il ​​before_filter nel tuo application_controller viene eseguito per tutti i controller, e se per qualsiasi ragione hai un controller che ha bisogno di generare etags usa solo skip_before_filter. – Kris

5

L'inserimento di response.etag = nil in un before_filter non funziona. L'etag viene generato subito prima dell'invio della risposta (è calucolato dal corpo quindi dopo che il rendering è stato eseguito).

La soluzione appropriata per disabilitare l'uso ETAG e la generazione (e quindi salvare il trascorrere del tempo in MD5) che questa patch scimmia:

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

sto lavorando in Rails 4 su WEBrick, cercando di ottenere una risposta alla cache fino alla scadenza in un momento specifico ogni giorno. Sembra che l'ETag generato automaticamente interferisca con la cache di scadenza, motivo per cui ho cercato questa risposta. Non ho trovato nulla di utile qui, ma ho risolto il mio problema, quindi condividerò.

tl; dr Impostare il Last-Modified intestazione

Ma impostarlo su che cosa? Nella mia situazione stavo cercando di ottimizzare un servizio web che restituiva i risultati di un processo che viene eseguito ogni giorno alla stessa ora. Le intestazioni di risposta finito per assomigliare a questo:

response.headers['Cache-Control'] = "max-age=86400" 
response.headers['Expires'] = getCacheTime 
response.headers['Last-Modified'] = getLastModified 

In primo luogo si vuole scrivere in modo esplicito l'intestazione Cache-Control per sovrascrivere qualunque sia il valore predefinito è. Ho impostato il mio in 24 ore per coincidere con il massimo dell'intestazione di scadenza. Ho impostato l'intestazione di scadenza con una funzione simile a questa:

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 

La funzione getLastModified ritorna esattamente 24 ore in meno rispetto alla funzione getCacheTime. Sembra che l'impostazione di questo sopprimerà l'ETag (un'altra intestazione di caching della validazione) almeno nel mio attuale ambiente di sviluppo.