2010-01-19 10 views

Respuesta

19

mucho más fácil:

config.middleware.delete Rack::ETag 
+1

¿Funciona esto para Rails 2.3 (según lo solicitado por el OP) o solo para Rails-3? – tokland

+1

¿En qué archivo sería esto? ¿Todavía funciona en rieles 4? – Philip7899

+0

Esta fue potencialmente la respuesta más útil que he visto en SO. – Philip7899

0

no creo que están activadas de forma predeterminada.

Según tengo entendido, deben establecerse explícitamente usando call obsoleto/fresh_when o similar.

+0

Revisé el controlador, no hay un código de obtención condicional. -daniel – Daniel

+0

Sí, también (estoy usando thin) ....Nunca me di cuenta de que antes de –

1

Hay un método etag colocador en el objeto ActionController::Response, lo que elimina la cabecera http etag si es blanco, por lo que sólo debe ser capaz de limpiar en su controlador (probablemente en una antes del filtro):

response.etag = nil 
+0

sí, pero tengo que hacerlo para todas las respuestas, mientras que podría hacerlo para cada controlador, eso sería tedioso después de un tiempo y sería propenso a errores. ¿Qué pasa si alguien se perdió una? – Daniel

-1

¿Por qué no agregar un before_filter en su controlador de aplicación que establece etag en nil?

+0

Preferiría no tener que ajustar más de 30 controladores y también asegurarme de que todo el mundo lo configure correctamente en el futuro. :) – Daniel

+1

Si coloca el before_filter en su application_controller se ejecutará para todos los controladores, y si por algún motivo tiene un controlador que necesita generar etags, simplemente use skip_before_filter. – Kris

5

Poner response.etag = nil en un before_filter no funciona. El etag se genera justo antes de que se envíe la respuesta (se calculó del cuerpo, por lo tanto, después de que se haya realizado la renderización).

La solución adecuada para deshabilitar el uso etag y la generación (y así salvar el tiempo que pasan en MD5) que este parche mono:

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

estoy trabajando en rieles 4 en WEBrick, tratando de obtener una respuesta al caché hasta que caduque a una hora específica cada día. Parece que la ETag autogenerada está interfiriendo con la memoria caché de expiración, razón por la cual busqué esta respuesta. No encontré nada útil aquí, pero resolví mi problema, así que lo compartiré.

tl; dr establecer la cabecera Last-Modified

Pero configurarlo para qué? En mi situación, intentaba optimizar un servicio web que devolvía los resultados de un proceso que se ejecuta a la misma hora todos los días. Los encabezados de respuesta terminaron con este aspecto:

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

En primer lugar, quiero escribir de forma explícita la cabecera Cache-Control sobrescribir cualquiera que sea el valor predeterminado es. Establecí el mío para que sea de 24 horas para que coincida con el máximo de mi encabezado de vencimiento. He establecido la cabecera de expiración con una función de la apariencia algo como esto:

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 

El función getlastmodified vuelve exactamente 24 horas menos que la función getCacheTime. Parece que configurar esto suprimirá el ETag (otro encabezado de caché de validación) al menos en mi entorno de desarrollo actual.