9

Rails アプリケーションをプロダクション モードでデプロイすると、すべての静的アセット URL の末尾に日時文字列がクエリ パラメータとして追加されます。これは、アプリケーションを再デプロイした後、ブラウザーが古くなった資産のキャッシュ コピーを使用するのを防ぐためです。

最後の展開以降に変更されていないアセット (および変更されていないアセットのみ)に古いタイムスタンプを使用するようにレールを作成する方法はありますか? ユーザーが変更されていないアセットを再ダウンロードする必要がないようにするために、これを行いたいと考えています。

4

3 に答える 3

13

Capistranoは、デフォルトで、「アセット」と見なされるすべてのファイルにアクセスします。あなたが言ったように、これはすべてのデプロイレールがすべてのアセットが変更されたと考えた後、ブラウザが毎回新しいバージョンをダウンロードすることを意味します。

Capistranoでこれを無効にするには、次の設定を使用します

set :normalize_asset_timestamps, false

SVNを使用している場合、ファイルの変更日は、リポジトリで最後に変更された日付を反映している必要があるため、完全である必要があります。

Apacheを使用している場合は、このようなものを追加して、キャッシュを実際に機能させることができます。これは、「キャッシュ制御」ディレクティブに依存するようにブラウザに指示することで役立ちます。つまり、アセットがキャッシュされていることがわかっている場合は、わざわざリクエストする必要もありません。

#Etags should be based on the file parameters only (default includes INode)
FileETag MTime Size  

#Rewrite stuff
RewriteEngine On  

#This sets the environment variable (is_versioned) when the URL query string
#looks like ?874353948543  or any string of digits
RewriteCond %{QUERY_STRING} ^[0-9]+$
RewriteRule ^(.*)$ $1 [env=is_versioned:true]  

<Directory /deployed-rails-app/public/ >
    Options -Indexes FollowSymLinks -MultiViews
    AllowOverride None
    Order allow,deny
    allow from all  

    #For files, force the browser to rely on cache-control directives and 
    #Rails asset timestamps by removing Etags and Last-Modified dates  

    #For all assets that aren't stamped by rails, cache them for ~ 3 hours
    Header set "Cache-Control" "max-age=10000"
    Header unset Etag
    Header unset "Last-Modified"  

    #For all assets that ARE stamped by rails, cache them for 30 days
    Header set "Cache-Control" "max-age=2592000" env=is_versioned

</Directory>

本番サーバーをこのように設定しましたが、リピーターは動的コンテンツを返す1つのリクエスト(Get /)のみを実行し、すべてのアセット(〜40〜50)がキャッシュされます。

于 2008-10-10T18:21:32.973 に答える
6

ENV['RAILS_ASSET_ID'] を使用してキャッシュ無効化アセット ID を変更できると思います。残念ながら、これはすべてのアセットに適用されます。

ただし、設定されていない場合は、アセットのソース変更時刻が使用されます。そのファイルが最後に使用してから変更されていない場合、問題にはなりません。

アセット ID が変更されていないのに変更されている場合は、デプロイ プロセスが変更時間を変更していることが原因である可能性があり、それを微調整することを検討できます。

最後に、いつでもrails_asset_id を独自のカスタム メソッドでオーバーライドできます。

お役に立てれば。

于 2008-10-08T23:48:43.107 に答える
0

@Aupajo私はこれが好きですが、もう少し先に進むことができると思います。ここでの問題は、capistrano がデプロイのたびにすべてのファイルの新しいコピーを作成するため、すべてのキャッシュ無効化文字列が変更されることです。ただし、ファイルの MD5 は、ファイルの内容が変更された場合にのみ変更されます。

もちろん、MD5 の生成は高価で時間がかかりますが、ファイルの MD5 を memcache にキャッシュすることができます (時刻が変更されたかのように、変更時刻をキーにすると、MD5が変更された可能性がありますが、タイムスタンプが変更されていない場合は、 MD5は変更されません

于 2008-10-09T11:16:33.873 に答える