5

注:私の仮定が間違っている場合は修正してください。これについてはよくわかりません...

私は Heroku で HTTP キャッシングをいじっており、Heroku で Varnish を使用してキャッシングするときにモバイルとデスクトップのリクエストを区別するための良い方法を見つけようとしています。

私の最初のアイデアはVary、キャッシュが Vared on になるようにヘッダーを設定できるということでしたIf-None-Match。Rails はコンテンツのハッシュから生成された etag を自動的に送り返すため、etag はデスクトップとモバイルの要求 (異なるテンプレート) の間で異なり、最終的には 2 つのバージョンをキャッシュします (事実ではなく、私の最初の考えです)。私はこれで遊んでいますが、うまくいかないと思います。

まず、何かがキャッシュされるとき/場合に頭を包み込むことはできませIf-None-Matchん。次に、実際には新しいリクエスト (If-None-Match のないリクエスト) がモバイル サイトを受信することがあります。If-None-Matchこれは、ヘッダーが存在しないため、モバイルまたはデスクトップのキャッシュ バージョンを提供するかどうかをキャッシュが認識していないためですか?

おそらく聞こえるかもしれませんが、私はかなり混乱しています。このアプローチは何らかの方法で機能しますか、それとも私はばかげていますか? また、(Heroku を使用しているため) Varnish 構成にまったくアクセスできない場合、個別のキャッシュ バージョンを取得する方法はありますか?

Railsでキャッシュヘッダーを設定するために使用している正確なコードは次のとおりです。

response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'

編集:使用できることは承知しVary: User-Agentていますが、ミス率が高いため(多くのユーザーエージェント)、可能であれば回避しようとしています。

4

2 に答える 2

2

あなたは試すことができVary: User-Agentます。ただし、1つのページのキャッシュされたバージョンが多数あります(ユーザーエージェントごとに1つ)。

他の解決策は、リバースプロキシでモバイルブラウザを直接検出し、リバースプロキシがキャッシュされたページを見つけようとする前にX-Is-Mobile-Browserクライアントヘッダーを設定Vary: X-Is-Mobile-Browserし、バックエンドサーバーにを設定することです(リバースプロキシが同じページの2つのバージョンのみをキャッシュVary: User-Agentし、クライアントに送信する前にそのヘッダーをに置き換えます。

于 2011-08-15T10:57:31.087 に答える