ご挨拶、
Ruby on Rails v2.3.5 で ETag をオフにする方法
RoR/Mongrel に直接リクエストすると、ETag ヘッダーが存在します。
ティア、
-ダニエル
ご挨拶、
Ruby on Rails v2.3.5 で ETag をオフにする方法
RoR/Mongrel に直接リクエストすると、ETag ヘッダーが存在します。
ティア、
-ダニエル
はるかに簡単:
config.middleware.delete Rack::ETag
before_filter を入れresponse.etag = nil
ても機能しません。etag は、応答が送信される直前に生成されます (すべてのレンダリングが完了した後、本文から計算されます)。
etag の使用と生成を無効にする (したがって、md5 に費やす時間を節約する) ための適切な回避策は、次のモンキー パッチです。
module ActionController
class Request
# never match any incomming etag
def etag_matches?(etag)
false
end
end
class Response
# fake rails that our response already has an etag set and so none is generated automatically
def etag?
true
end
end
end
etag
オブジェクトにはセッター メソッドがありActionController::Response
、ETag HTTP ヘッダーが空白の場合は削除されるため、コントローラーでそれをクリアできるはずです (おそらく before フィルターで)。
response.etag = nil
私はWEBrickのRails 4で作業しており、毎日特定の時間に有効期限が切れるまでキャッシュへの応答を取得しようとしています。自動生成された ETag が有効期限キャッシュに干渉しているように見えるため、この回答を検索しました。ここで役立つものは何も見つかりませんでしたが、問題は解決したので共有します。
tl;drLast-Modified
ヘッダーを設定します
しかし、それを何に設定しますか?私の状況では、毎日同時に実行されるプロセスの結果を返す Web サービスを最適化しようとしていました。私の応答ヘッダーは次のようになりました。
response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified
最初に、Cache-Control
ヘッダーを明示的に記述して、デフォルトが何であれ上書きします。有効期限ヘッダーの最大値と一致するように、24 時間に設定しました。次のような関数で有効期限ヘッダーを設定します。
def getCacheTime
now = Time.now.utc
cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
if now > cacheTime
cacheTime = cacheTime + (60 * 60 * 24)
end
cacheTime.httpdate
end
getLastModified関数は、 getCacheTime関数よりも正確に 24 時間少ない時間を返します。これを設定すると、少なくとも現在の開発環境では ETag (別の検証キャッシュ ヘッダー) が抑制されるようです。
デフォルトではオンになっていないと思います。
私の理解では、stale?/fresh_when 呼び出しなどを使用して明示的に設定する必要があります。
etag を nil に設定する before_filter をアプリケーション コントローラに追加してみませんか?