11

サードパーティのWebサイトが使用しているスクリプトがあります/assets/script.js。明らかな理由で、最新のフィンガープリントバージョンのスクリプトを指すように展開するたびにリンクを変更するように依頼することはできません。ユーザーに古いバージョンのが表示されるキャッシュの問題がいくつか発生しました/script.jsscript.js代わりに キャッシュを直接削除する方法はありますscript-9dc5afea3571ba2a883a72b0da0bb623.jsか?

詳細情報:乗客+Nginxのレール。script.jsフィンガープリントされたファイルの代わりにファイルを提供し、すべての展開でキャッシュを無効にする方法を探しています。

デプロイメントgitリビジョンに基づいてETagを追加することを考えましたが、これを行う方法がわかりません。Nginxには組み込みのETagサポートはありません。これを行うサポートされていない古いサードパーティモジュールがあります。これに使用できますadd_header Etag="something"が、そこにgitバージョンを追加するにはどうすればよいですか。

他のアイデアやオプションはありますか?

ありがとう!

4

8 に答える 8

9

パブリックインターフェイスの一部である名前のスクリプトがある場合は、このスクリプトのバージョン管理を明示的に開始し、古いバージョンを古いクライアント用に保持する必要があります。

例:/assets/script.1.0.js、/assets/script.1.1.jsなど

重要なのは、古いものを保持する必要があることです。名前が明示的に変更されない限り、コードは変更されません。Railsアセットパイプラインではこれを行うことはできません。通常、スクリプトの最新バージョンのみが最新の状態に保たれているためです。

すべてのパブリックインターフェイスと同様に、内部のみのスクリプトの場合よりも、このプロセスの管理に多くの時間を費やす必要があります。

于 2012-12-26T03:44:07.990 に答える
3

ETagの使用をお勧めします。応答にETagヘッダーを追加します http://en.wikipedia.org/wiki/HTTP_ETag

スクリプトのバージョンごとに、ETagヘッダーを異なる一意の文字列に設定します。これにより、新しいバージョンをデプロイするたびに、ブラウザが新しいバージョンのスクリプトを取得できるようになります。

于 2012-12-27T20:59:11.573 に答える
3

nginxは最新バージョンでetagを生成できます:http://nginx.org/en/docs/http/ngx_http_core_module.html#etag

以下の構成も確認しました:https ://serverfault.com/questions/426260/nginx-cache-control

location /static {
  alias /opt/static/blog/;
  access_log off;
  etags on;
  etag_hash on;
  etag_hash_method md5;
  expires     1d;
  add_header Pragma "public";
  add_header Cache-Control  "public, must-revalidate, proxy-revalidate";
}
于 2013-03-14T12:51:29.897 に答える
1

ETagの提案をフォローアップすると、このgemが役立つ場合があります:bust_rails_etags。これにより、ETagの生成に使用される各デプロイにキーを設定できます。これにより、アプリがデプロイされるたびにETagが変更されます(したがって、キャッシュされたスクリプトは無効になります)。作成者は、Herokuのリリース番号の例を、デプロイごとに変更されるキーとして使用します。

于 2012-12-28T14:00:54.730 に答える
1

アセットの更新に使用しているのは次のとおりです。

  1. config.assets.versionconfig/application.rbようにインクリメント

    #Version of your assets, change this if you want to expire all your assets
    config.assets.version = '1.1'
    
  2. bundle exec rake assets:precompile RAILS_ENV=production RAILS_GROUPS=assets

  3. アプリを再起動し、ウェブサーバーのキャッシュがある場合は空にします

于 2013-03-12T04:17:51.450 に答える
1

サードパーティのWebサイトにフィンガープリントされていないアセットURLが必要です。 例:assets / public_api.js

特定のアセットをフィンガープリントから除外するプラグインまたはgemがあります。ただし、railsは、フィンガープリントされていないファイルも作成するように、事前コンパイルプロセスを変更しました。したがって、これは問題ではありません。詳細はこちら。

アセットがフィンガープリントされていないときに、クライアントが最新のデプロイ済みスクリプトをロードしていることを確認するにはどうすればよいですか?

youTubeがAPIを公開するために使用するソリューションをお勧めします。基本的にすべてのassets/public_api.jsは、別のスクリプトタグをdomに挿入します。注入されたものは実際のAPIコードをロードします。これで、assets/public_api.jsがassets/public_api.js.erbになり、次のようになります。

var tag = document.createElement('script');
tag.src = "<%=asset_path('/assets/javascripts/acctual_api')%>";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

tag.srcが/assets/ javascripts/acctual_apiへの現在のフィンガープリントパスにどのように設定されているかに注意してください。このようにして、ユーザーは常に最新のコンパイル済みacctual_apiスクリプトを取得します。

Assets / public_api.jsのETAGを更新するにはどうすればよいですか?

Capistranoまたは同様のレシピベースの展開ソリューションを使用していると思います。たぶん、再起動する前にサーバー構成ファイルを更新する展開ステップを追加できます。更新する必要があります:

add_header Etag="update_me_on_deploy"

このアプローチでも、バージョン管理された(assets / public_api.0.js)パブリックスクリプトを使用する必要があることに注意してください。

于 2013-03-15T14:56:05.233 に答える
1

Capistranoを使用している場合は、アセットがプリコンパイルされた後、パブリック/アセットからパブリック内の別のディレクトリ(つまりパブリック/スクリプト)にスクリプトをコピーするタスクを作成できます。

于 2013-03-15T18:42:08.557 に答える
1

さて、あなたはファイルの指紋を取り除くことができます:

asset_path('script.js', :digest => false)

それが役に立てば幸い

または、必要に応じてこのgemを使用できます:https ://github.com/spohlenz/digestion

ただし、Railsアセットパイプラインは、ダイジェストありとなしの両方でアセットファイルをコンパイルするようになりました。

したがって、アセットを生成した後、通常、script.js?xxxxxとscript.jsをpublic/assetsフォルダーに入れます。

于 2013-03-15T19:00:26.770 に答える