Ruby on Rails, как отключить / отключить ETag - PullRequest
8 голосов
/ 19 января 2010

Привет,

Как отключить ETag в Ruby on Rails v2.3.5

Когда я делаю прямой запрос к RoR / Mongrel, присутствует заголовок ETag.

TIA,

-даниель

Ответы [ 6 ]

21 голосов
/ 19 апреля 2012

намного проще:

config.middleware.delete Rack::ETag
5 голосов
/ 06 мая 2010

Помещение response.etag = nil в before_filter не работает.Этаг генерируется непосредственно перед отправкой ответа (он вычисляется из тела, то есть после того, как был сделан весь рендеринг).

Правильный обходной путь, чтобы отключить использование и генерацию etag (и таким образом сэкономить время, потраченное в md5)это патч обезьяны:

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
1 голос
/ 19 января 2010

Существует метод установки etag для объекта ActionController::Response, который удаляет HTTP-заголовок ETag, если он пуст, так что вы должны просто иметь возможность очистить его в контроллере (возможно, до фильтр):

response.etag = nil
0 голосов
/ 05 октября 2016

Я работаю в Rails 4 на WEBrick, пытаясь получить ответ на кеш, пока он не истечет в определенное время каждый день.Похоже, что автоматически сгенерированный ETag мешает кешу истечения, поэтому я искал этот ответ.Здесь я не нашел ничего полезного, но я решил свою проблему, поэтому я поделюсь.

tl; dr Установить заголовок Last-Modified

Но установить что?В моей ситуации я пытался оптимизировать веб-сервис, который возвращал результаты процесса, который выполняется в одно и то же время каждый день.Заголовки моего ответа в итоге выглядели так:

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

Сначала вы хотите явно написать заголовок Cache-Control, чтобы перезаписать, какой бы ни была установка по умолчанию.Я установил мой на 24 часа, чтобы он совпал с максимумом моего заголовка истечения.Я установил срок действия заголовка с помощью функции, которая выглядит примерно так:

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

Функция getLastModified возвращает ровно на 24 часа меньше, чем функция getCacheTime .Похоже, что установка этого параметра подавит ETag (еще один заголовок кэширования валидации) по крайней мере в моей текущей среде разработки.

0 голосов
/ 05 марта 2010

Почему бы не добавить before_filter в контроллер вашего приложения, который устанавливает etag в nil?

0 голосов
/ 19 января 2010

Я не думаю, что они включены по умолчанию.

Насколько я понимаю, они должны быть явно установлены с использованием устаревшего вызова? / Fresh_when или аналогичного.

...