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

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top