6

URL /products でアクセスできるページがあります。ブラウザーでアクセスすると、レイアウト内のフルページで応答します。リクエスト ヘッダーとレスポンス ボディの簡単な例を次に示します。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

<layout>
<products />
</layout>

ユーザーが何らかの検索を行うと、JavaScript が AJAX を介して結果を更新します。レンダリングには時間がかかるため、結果はレイアウトなしでレンダリングされますが、とにかくそれは必要ありません。

Accept: */*;q=0.5, text/javascript, application/javascript, application/ecmascript, application/x-ecmascript
X-Requested-With: XMLHttpRequest

<products />

したがって、これは caching を追加するまではうまくいきましCache-Control: private, max-age=3600た。最初は、Vary: X-Requested-Withヘッダーを追加すると、ブラウザーが 2 つの応答を区別することになります。ただし、AJAX 経由で /products を取得し、ブラウザーで /products にアクセスすると、部分的な AJAX 応答が表示されます。

この問題を解決する簡単な方法はありますか?

PS私はRuby on RailsとjQueryを使用しています。

4

6 に答える 6

1

Ajax 呼び出しで、/products/partial などの別の URL を使用します。

于 2012-07-07T01:01:57.253 に答える
0

を使用しVary: Acceptます。これはうまくいくはずです。

于 2012-07-13T09:26:31.903 に答える
0

おそらく最も簡単な方法は、jquery の Ajax メソッドの「キャッシュ」パラメーターを「False」に設定することです。タイムスタンプが URI に自動的に追加され、キャッシュされるのを防ぎます。

これは、次のスニペットを使用してアプリケーション全体で実行できます。

$.ajaxSetup({
    cache: false
});

動的リクエストでもキャッシュが問題になる場合は、日付と時間に基づいてタイムスタンプを自分で生成できます。

于 2012-07-13T14:25:42.563 に答える
0

部分的な結果には別の URL が必要です (つまり、?partial=yes など)。

また

ajax 経由でページ全体を取得し、jquery.load() を使用して必要な部分だけを抽出できます。

$("#productsContainerHolder").load("/my/products/url #productsContainer", { myParam: "beer", myParam2: "cold"});

$.load は「GET」メソッドでサーバーを呼び出し、すべてのコンテンツを取得し、そこから #productsContainer を抽出して、「#productsContainerHolder」に挿入します。

<div id="productsContainerHolder">
    <div id="productsContainer>
         ...
    </div>
</div>
于 2012-07-10T16:29:10.487 に答える
0

この記事by Steve Luscher は、問題があなたが説明したものよりも断続的だった同様のケースについて説明しています。推奨される解決策は次のとおりです。

  1. フォーム送信時にすべての AJAX リクエストをキャンセルする

  2. 期待する応答に応じて別の URL を使用する

Steve は、ajax リクエストで cancel() を使用して 1 位を獲得しました。

使用したブラウザについては言及していません。ここにブラウザ関連の質問があります

于 2012-07-12T22:06:57.633 に答える
0

Try sending must-revalidate instead of private (which is more for proxy).

Cache-Control: max-age=3600, must-revalidate

I recommend reading this article: http://www.mnot.net/cache_docs/ it might help. And also use Mark's tool http://redbot.org/ to test your results to eliminate your local machine or isp or what not.

于 2012-07-14T00:25:17.503 に答える