Saludos,Ruby on Rails, cómo deshabilitar/desactivar ETag
¿Cómo puedo desactivar ETag (s) en Ruby on Rails v2.3.5
Cuando hago una petición directa a la RoR/Mongrel y un encabezado ETag está presente.
TIA,
-Daniel
Saludos,Ruby on Rails, cómo deshabilitar/desactivar ETag
¿Cómo puedo desactivar ETag (s) en Ruby on Rails v2.3.5
Cuando hago una petición directa a la RoR/Mongrel y un encabezado ETag está presente.
TIA,
-Daniel
mucho más fácil:
config.middleware.delete Rack::ETag
no creo que están activadas de forma predeterminada.
Según tengo entendido, deben establecerse explícitamente usando call obsoleto/fresh_when o similar.
Revisé el controlador, no hay un código de obtención condicional. -daniel – Daniel
Sí, también (estoy usando thin) ....Nunca me di cuenta de que antes de –
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
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
¿Por qué no agregar un before_filter en su controlador de aplicación que establece etag en nil?
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
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
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
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.
¿Funciona esto para Rails 2.3 (según lo solicitado por el OP) o solo para Rails-3? – tokland
¿En qué archivo sería esto? ¿Todavía funciona en rieles 4? – Philip7899
Esta fue potencialmente la respuesta más útil que he visto en SO. – Philip7899