Pergunta

Saudações,

Como faço para desligar o ETAG (s) em Ruby on Rails v2.3.5

Quando faço uma solicitação direta ao ROR/MONGREL, um cabeçalho ETAG está presente.

Tia,

-daniel

Foi útil?

Solução

muito facil:

config.middleware.delete Rack::ETag

Outras dicas

Colocando response.etag = nil em um antes_filter não funciona. O ETAG é gerado logo antes da resposta ser enviada (é calluculada do corpo, para que toda a renderização seja feita).

A solução alternativa adequada para desativar o uso e a geração do ETAG (e, portanto, economize o tempo gasto no MD5) neste patch de macaco:

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

Há uma etag Método Setter no ActionController::Response Objeto, que exclui o cabeçalho ETAG HTTP, se estiver em branco, portanto, você poderá limpá -lo no seu controlador (provavelmente em um filtro antes):

response.etag = nil

Eu não acho que eles estão ligados por padrão.

Meu entendimento é que eles precisam ser explicitamente definidos usando obsoleto?/Fresh_when chamado ou similar.

Estou trabalhando no Rails 4 na Webrick, tentando obter uma resposta ao cache até que expire em um horário específico todos os dias. Parece que o ETAG gerado automaticamente está interferindo no cache de expiração, e é por isso que procurei essa resposta. Não encontrei nada útil aqui, mas resolvi meu problema, então vou compartilhar.

tl; dr define o Last-Modified cabeçalho

Mas defina o quê? Na minha situação, eu estava tentando otimizar um serviço da Web que retornava os resultados de um processo que é executado ao mesmo tempo todos os dias. Meus cabeçalhos de resposta acabaram parecendo assim:

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

Primeiro você quer escrever explicitamente o Cache-Control Cabeçalho para substituir o que for o padrão. Definei o meu para 24 horas para coincidir com o máximo do meu cabeçalho de vencimento. Defino o cabeçalho de expiração com uma função, a aparência assim:

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

o getLastmodified função retorna exatamente 24 horas a menos que o GetCacheTime função. Parece que definir isso suprimirá o ETAG (outro cabeçalho de cache de validação) pelo menos no meu ambiente de desenvolvimento atual.

Por que não adicionar um antes_filter no seu controlador de aplicativos que define o ETAG para NIL?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top