Saluti,Ruby on Rails, come disabilitare/disattivare ETag
Come faccio a disattivare ETag (s) in Ruby on Rails v2.3.5
Quando faccio una richiesta diretta ad al RoR/Mongrel è presente un'intestazione ETag.
TIA,
-Daniel
Saluti,Ruby on Rails, come disabilitare/disattivare ETag
Come faccio a disattivare ETag (s) in Ruby on Rails v2.3.5
Quando faccio una richiesta diretta ad al RoR/Mongrel è presente un'intestazione ETag.
TIA,
-Daniel
molto più facile:
config.middleware.delete Rack::ETag
Non credo che siano per impostazione predefinita.
La mia comprensione è che devono essere impostati esplicitamente utilizzando stantio/nuova_quando chiamata o simile.
Ho controllato il controller non c'è codice di ricezione condizionale. -daniel – Daniel
Sì, lo fa anche io (sto usando sottile) ....mai notato prima di –
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
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
Perché non aggiungere un before_filter nel controller dell'applicazione che imposta etag su zero?
Preferirei non dover aggiustare più di 30 controller e anche assicurarmi che tutti lo impostino correttamente in futuro. :) – Daniel
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
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
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.
Funziona per Rails 2.3 (come richiesto dall'OP), o è solo Rails-3? – tokland
In quale file dovrebbe andare? Funziona ancora su rotaie 4? – Philip7899
Questa è stata potenzialmente la risposta più utile che ho visto su SO. – Philip7899