Вопрос

Приветствия,

Как мне отключить ETag (ы) в Ruby on Rails версии v2.3.5

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

ТИА,

-дэниел

Это было полезно?

Решение

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

config.middleware.delete Rack::ETag

Другие советы

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

Правильное решение для отключения использования и генерации 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

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

response.etag = nil

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

Насколько я понимаю, их нужно явно задать с помощью stale?/fresh_when call или аналогичного.

Я работаю в Rails 4 на WEBrick, пытаясь получить ответ на cache, пока он не истечет в определенное время каждый день.Похоже, что автоматически сгенерированный 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 (другого заголовка кэширования проверки), по крайней мере, в моей текущей среде разработки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top