3

「通常の」ブラウザ要求と、要求された同じ URL に対する AJAX 要求に対して異なるコンテンツを提供することになっているアプリケーションを開発しています。(実際、リクエストが AJAX の場合は、レスポンス HTML を JSON オブジェクトにカプセル化します)。

この目的のために、サーバー側で AJAX 要求を検出し、応答を適切に処理しています。以下の擬似コードを参照してください。

function process_response(request, response)
{
 if request.is_ajax 
 {
   response.headers['Content-Type'] = 'application/json';
   response.headers['Cache-Control'] = 'no-cache';
   response.content = JSON( some_data... )
 }
}

問題は、現在表示されている URL への最初の AJAX 要求が行われたときに、Google Chrome で奇妙なことが起こることです。応答が来て JavaScript によって処理された直後に、ユーザーが何らかのリンク (静的で、他のページにリダイレクトする) をクリックすると、次に、ブラウザーの [戻る] ボタンをクリックすると、レンダリングされた Web サイトではなく、返された JSONコードが表示されます (サーバーをログに記録すると、要求が行われていないと言えます)。Chrome は特定の URL に対する最新のリクエスト応答を保存しているように思えますが、異なるコンテンツ タイプなどを考慮していません。

それは Chrome のバグですか、それともHTTP プロトコルを誤用していますか?

--- 2012 年 11 月 12 日更新、12:38 UTC

PatrikAkerstrand の回答に従って、次の Chrome バグを見つけました: http://code.google.com/p/chromium/issues/detail?id=94369

この動作を回避する方法はありますか?

4

3 に答える 3

2

Vary-headerまた、 :を含める必要があります

response.headers['Vary'] = 'Content-Type'
于 2012-11-12T12:24:08.047 に答える
0

Varyコンテンツ ネゴシエーションでキャッシュ コンテキストを制御する標準的な方法です。残念ながら、一部のブラウザーではバグのある実装もあります。ブラウザーのキャッシュが壊れている を参照してください。

固有の URL を使用することをお勧めします。フレームワークの機能に応じて、ブラウザーを URL + にリダイレクト (302) して、.html応答形式を強制し、ブラウザー セッション内でキャッシュ キーを一意にすることができます。その後、AJAX リクエストの場合、サフィックスのない URL を保持できます。または、代わりにAJAX URL のサフィックスを付けることもできます.json

別のオプションとして、AJAX リクエストに接頭辞を付ける/apiか、いくつかのキャッシュ ブースト クエリ パラメータを追加します?rand=1234

于 2014-11-11T22:00:18.090 に答える