2010-01-19 2 views

ответ

19

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

config.middleware.delete Rack::ETag 
+1

Это работает для Rails 2.3 (по запросу OP), или это только Rails-3? – tokland

+1

В каком файле это будет идти? Он все еще работает в рельсах 4? – Philip7899

+0

Это был потенциально наиболее полезный ответ, который я видел на SO. – Philip7899

0

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

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

+0

Я проверил контроллер, нет условного кода. -daniel – Daniel

+0

Да, это тоже (я использую тонкие) ....никогда не замечал, что до –

1

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

response.etag = nil 
+0

да, но мне нужно сделать это для всех ответов, в то время как я мог бы сделать это для каждого контроллера, который через некоторое время станет утомительным и будет подвержен ошибкам. Что, если кто-то пропустил его? – Daniel

-1

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

+0

Я бы предпочел не настраивать некоторые контроллеры 30+, а также следить за тем, чтобы все правильно настраивали их в будущем. :) – Daniel

+1

Если вы поместите файл before_filter в свой прикладной контроллер, он запускается для всех контроллеров, и если по какой-либо причине у вас есть контроллер, который должен генерировать etags, просто используйте skip_before_filter. – Kris

5

Ввод 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 
0

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

Т.Л., д-р Установить 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 (еще один заголовок кэширования проверки), по крайней мере, в моей текущей среде разработки.

 Смежные вопросы

  • Нет связанных вопросов^_^