Как предотвратить кеширование страницы браузера в Rails

Ubuntu → Apache → Phusion Passenger → Rails 2.3

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

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

Отдельно, я хочу установить даты истечения дат будущего для всех моих статических активов.

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

Спасибо за вашу помощь, Джейсон


Увы. Ни одно из этих предложений не привело к поведению, которое я ищу.

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

Считаете ли вы, что это сработает?

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

Джейсон

Ответ 1

Наконец понял это - 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

Ответ 3

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

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

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

stylesheet_link_tag

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

Ответ 4

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

Ответ 5

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

Пример:

before_filter :reset_cache, if: :user_completed_demographics?

не будет работать, чтобы пользователи не возвращались после того, как они были там, поскольку браузер использует исходные заголовки кеша на кнопке "Назад".

before_filter :reset_cache

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

Ответ 6

no_cache_control Самоцвет.

Если вам нужно сделать это для всех ответов, например, чтобы пройти тест на проникновение (BURP, Detectify и т.д.), вы можете установить этот Gem on Rails 4+, чтобы добавить следующие заголовки ко всем ответам:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: -1

Работает как шарм и действительно является правильным выбором для безопасных веб-приложений HTTPS, которым для выполнения каких-либо действий требуется аутентификация.