Привет,Рубин на Rails, как отключить/отключить ETag
Как отключить ETag (ы) в Ruby On Rails v2.3.5
Когда я сделать прямой запрос в RoR/Mongrel - заголовок ETag.
ТИА,
-daniel
Привет,Рубин на Rails, как отключить/отключить ETag
Как отключить ETag (ы) в Ruby On Rails v2.3.5
Когда я сделать прямой запрос в RoR/Mongrel - заголовок ETag.
ТИА,
-daniel
намного проще:
config.middleware.delete Rack::ETag
Я не думаю, что они по умолчанию.
Я понимаю, что они должны быть явно заданы с использованием устаревшего вызова/fresh_when или подобного.
Я проверил контроллер, нет условного кода. -daniel – Daniel
Да, это тоже (я использую тонкие) ....никогда не замечал, что до –
Там есть метод etag
сеттер на ActionController::Response
объекта, который удаляет заголовок ETag HTTP, если это пустой, так что вы просто должны быть в состоянии очистить его в контроллер (вероятно, в перед фильтром):
response.etag = nil
да, но мне нужно сделать это для всех ответов, в то время как я мог бы сделать это для каждого контроллера, который через некоторое время станет утомительным и будет подвержен ошибкам. Что, если кто-то пропустил его? – Daniel
Почему бы не добавить before_filter в контроллер приложения, который устанавливает etag в nil?
Я бы предпочел не настраивать некоторые контроллеры 30+, а также следить за тем, чтобы все правильно настраивали их в будущем. :) – Daniel
Если вы поместите файл before_filter в свой прикладной контроллер, он запускается для всех контроллеров, и если по какой-либо причине у вас есть контроллер, который должен генерировать etags, просто используйте skip_before_filter. – Kris
Ввод 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
Я работаю в 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 (еще один заголовок кэширования проверки), по крайней мере, в моей текущей среде разработки.
Это работает для Rails 2.3 (по запросу OP), или это только Rails-3? – tokland
В каком файле это будет идти? Он все еще работает в рельсах 4? – Philip7899
Это был потенциально наиболее полезный ответ, который я видел на SO. – Philip7899