Ruby on Rails, come disabilitare / spegnere ETag
-
21-09-2019 - |
Domanda
Saluti,
Come faccio a disattivare ETag (s) in Ruby on Rails v2.3.5
Quando faccio una richiesta diretta per la RoR / Mongrel un header ETag è presente.
TIA,
-Daniel
Soluzione
molto più facile:
config.middleware.delete Rack::ETag
Altri suggerimenti
Mettere response.etag = nil
in una before_filter non funziona. L'ETAG viene generato appena prima che la risposta è inviare (è conteggiata dal corpo così dopo tutto il rendering è stato fatto).
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
C'è un etag
metodo setter sull'oggetto ActionController::Response
, che cancella l'header HTTP ETag se è vuoto, così si dovrebbe solo essere in grado di cancellare nel vostro controller (probabilmente in un prima del filtro):
response.etag = nil
Non credo che siano di default.
La mia comprensione è che hanno bisogno di essere esplicitamente impostare utilizzando stantio? / Call fresh_when o simili.
Sto lavorando in Rails 4 su WEBrick, cercando di ottenere una risposta per mettere in cache fino alla scadenza in un momento specifico ogni giorno. Sembra che l'ETag generato automaticamente interferisce con la scadenza della cache è per questo che ho cercato per questa risposta. Non ho trovato nulla di utile qui, ma ho risolto il mio problema, così io condividere.
tl; dr Impostare l'intestazione Last-Modified
Ma impostarlo su che cosa? Nella mia situazione stavo cercando di ottimizzare un servizio web che ha restituito i risultati di un processo che viene eseguito alla stessa ora ogni giorno. 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 la mia per essere di 24 ore in coincidenza con il massimo della mia 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
getLastModified funzione restituisce esattamente 24 ore in meno rispetto alla funzione getCacheTime . Sembra che l'impostazione di questo sopprimerà l'ETag (altro colpo di testa di convalida caching) almeno nel mio ambiente di sviluppo attuale.
Perché non aggiungere un before_filter nel controllore dell'applicazione che definisce etag a zero?