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

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top