Как предотвратить кеширование страниц браузера в Rails - PullRequest
145 голосов
/ 03 апреля 2009

Ubuntu -> Apache -> Phusion Passenger -> Rails 2.3

Основная часть моего сайта реагирует на ваши клики. Таким образом, если вы нажмете на ссылку, она отправит вас к месту назначения и мгновенно восстановит вашу страницу.

Но, если вы нажмете кнопку "Назад", вы не увидите новую страницу. К сожалению, оно не отображается без обновления вручную; кажется, что браузер кеширует его. Я хочу убедиться, что браузер не кэширует страницу.

Отдельно я делаю хочу установить даты истечения срока давности для всех моих статических активов.

Какой лучший способ решить это? Должен ли я решить это в Rails? Apache? Javascript?

Спасибо за вашу помощь, Jason


Увы. Ни одно из этих предложений не заставило меня искать нужное поведение.

Может быть, есть ответ на javascript? Я мог бы сделать так, чтобы rails записали временную метку в комментарии, а затем проверили javascript, чтобы увидеть, находятся ли времена в течение пяти секунд (или как это работает). Если да, то хорошо, но если нет, то перезагрузите страницу?

Как вы думаете, это будет работать?

Спасибо за вашу помощь,

Jason

Ответы [ 5 ]

321 голосов
/ 14 апреля 2009

Наконец понял это - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ в application_controller.rb

class ApplicationController < ActionController::Base

before_filter :set_cache_headers

  private

  def set_cache_headers
    response.headers["Cache-Control"] = "no-cache, no-store"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
  end
end
14 голосов
/ 05 июля 2011
3 голосов
/ 03 апреля 2009

Я использовал эту строку с некоторым успехом в контроллере. Он работает в Safari и Internet Explorer, но я не видел, чтобы он работал с Firefox.

response.headers["Expires"] = "#{1.year.ago}"

Для вашего второго пункта, если вы используете вспомогательные методы rails, такие как

stylesheet_link_tag

и оставьте настройки по умолчанию на вашем веб-сервере, ресурсы обычно кешируются довольно хорошо.

1 голос
/ 20 февраля 2016

Примечание: вы не можете условно очистить кеш (например, если before_filter вызывает reset_cache, только если пользователь уже был там). Вам необходимо безоговорочно очистить кеш, потому что браузер не будет делать новый запрос, просто чтобы посмотреть, нужно ли его на этот раз перезагрузить, даже если в прошлый раз это не требовалось.

Пример:

before_filter :reset_cache, if: :user_completed_demographics?

не будет препятствовать возвращению пользователей после того, как они побывали там, поскольку браузер использует оригинальные заголовки кэша на кнопке Назад.

before_filter :reset_cache
Однако

будет работать (после обновления страницы и очистки кеша до того, как вы добавили это, очевидно), поскольку по первому запросу браузер получит no-cache, no-store, ... и применит его к будущим загрузкам страницы. *

1 голос
/ 07 ноября 2010

Более чистым способом было бы написать промежуточное программное обеспечение Rack, которое изменяет заголовок Cache-Control на основе некоторой логики (например, только для application / xml mime-type). Или, для более уродливого, но все еще работающего подхода, можно изменить константу ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL на 'no-cache'. Конечно, если требуется контроллер и / или гранулярность действий, лучше сделать это в контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...