web-dev-qa-db-ja.com

Railsでブラウザページのキャッシュを防ぐ方法

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

私のサイトの主要部分はあなたのクリックに反応します。したがって、リンクをクリックすると、リンク先に移動し、すぐにページを再生成します。

ただし、戻るボタンを押すと、新しいページは表示されません。残念ながら、手動で更新しないと表示されません。ブラウザがキャッシュしているようです。ブラウザがページをキャッシュしないことを確認したい。

個別に、私はdoすべての静的アセットに将来の有効期限を設定したい。

これを解決する最良の方法は何ですか? Railsでこれを解決する必要がありますか?アパッチ? Javascript?

ジェイソン


ああ。これらの提案のどちらも、私が探している動作を強制するものではありませんでした。

たぶんjavascriptの答えがありますか? Railsコメントにタイムスタンプを書き出してから、時間が5秒以内(または何でも機能する)であるかどうかをjavascriptでチェックすることができます。 、それからページをリロードしますか?

これはうまくいくと思いますか?

ご助力いただきありがとうございます、

ジェイソン

145
Jason Butler

最後にこれを理解しました- http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-Rails/ in 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
322
Jason Butler
14
Sacre

この行を使用して、コントローラーである程度の成功を収めました。 SafariとInternet Explorerで動作しますが、Firefoxで動作するのを見たことがありません。

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

2番目のポイントとして、Rails

stylesheet_link_tag

ウェブサーバーのデフォルト設定のままにしておくと、通常、アセットはかなり適切にキャッシュされます。

3
erik

よりクリーンな方法は、いくつかのロジックに基づいてCache-Controlヘッダーを変更するRackミドルウェアを作成することです(たとえば、application/xml mime-typeのみ)。または、いですが、まだ機能しているアプローチのために、ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL定数を 'no-cache'に変更できます。もちろん、コントローラーやアクションの粒度が必要な場合は、コントローラーでこれを行うことをお勧めします。

1
Roman

注:キャッシュを条件付きでクリアすることはできません(before_filterreset_cacheを呼び出すのは、ユーザーが既にそこにいる場合など)。 無条件キャッシュをクリアする必要があります。ブラウザーは、前回は必要なかったとしても、今回はリロードする必要があるかどうかを確認するためだけに新しいリクエストを作成しないためです。

例:

before_filter :reset_cache, if: :user_completed_demographics?

ブラウザは[戻る]ボタンで元のキャッシュヘッダーを使用するため、ユーザーがそこに行った後に戻ってくるのを防ぐためには機能しません。

before_filter :reset_cache

ただし、最初のリクエストでブラウザがno-cache, no-store, ...を取得し、それを将来のページの読み込みに適用するため、(ページを更新し、これを追加する前にキャッシュをクリアした後は明らかに)動作します。

1