Ruby on Rails, cómo desactivar / apagar ETag
-
21-09-2019 - |
Pregunta
Saludos,
¿Cómo apago ETag (s) en Ruby on Rails v2.3.5
Cuando hago una petición directa a la RoR / Mestizo una cabecera ETag está presente.
TIA,
-Daniel
Solución
mucho más fácil:
config.middleware.delete Rack::ETag
Otros consejos
Poner response.etag = nil
en un before_filter no funciona. Se genera el etag justo antes de que la respuesta es enviar (se caluculated del cuerpo por lo que después de todo la representación se ha hecho).
La solución adecuada para deshabilitar el uso etag y la generación (y así ahorrar 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
Hay un etag
método setter en el objeto ActionController::Response
, que elimina la cabecera HTTP ETag si es blanco, por lo que sólo debe ser capaz de limpiar en su controlador (probablemente en un filtro antes):
response.etag = nil
No creo que están activadas de forma predeterminada.
Mi opinión es que es necesario que se establezca explícitamente el uso de rancio? / Llamada fresh_when o similar.
Estoy trabajando en los carriles 4 en WEBrick, tratando de obtener una respuesta a almacenar en caché hasta que caduque a una hora específica cada día. Parece que la ETag autogenerado está interfiriendo con la caducidad de la caché por lo que he buscado esta respuesta. No he encontrado nada útil aquí, pero yo resuelvo mi problema, por lo que voy a compartir.
tl; dr establecer la cabecera Last-Modified
Pero configurarlo para qué? En mi situación estaba tratando de optimizar un servicio web que devuelve los resultados de un proceso que se ejecuta al mismo tiempo 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 desea escribir explícitamente la cabecera Cache-Control
sobrescribir cualquiera que sea el valor predeterminado es. Yo la mía a ser de 24 horas para que coincida con el máximo de mi cabecera de caducidad. He establecido la cabecera de expiración con una la función es como la siguiente:
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 getlastmodified función devuelve exactamente 24 horas menos que el getCacheTime función. Parece que el establecimiento de esta suprimirá la ETag (otra cabecera de validación de almacenamiento en caché) al menos en mi entorno de desarrollo actual.
¿Por qué no añadir un before_filter en su controlador de aplicación que establece etag a cero?