web-dev-qa-db-ja.com

ARR-特定のリクエスト(認証されたユーザー)のディスクキャッシュを動的に無効にします

これは、アプリケーションリクエストルーティングと特定のリクエストのディスクキャッシュを動的に無効にすることに関するものです(リクエストが認証されたユーザーからのものであり、認証されているかどうかはカスタムコードで決定できます)。

私のセットアップでは、ARRを実行しているサーバーがあり、別のサーバー上のASP.NETMVCサイトに要求をディスパッチします。サイトはフォーム認証(場合によってはHTTP基本認証)を使用するため、認証はARRではなくMVCサイトで行われます。基本的にユーザーがサイトを認証すると、フォーム認証Cookieが作成されます。

ARRで次のことを実行したいと思います。

  • 匿名ユーザーの出力キャッシュを実行します。
  • 認証されたユーザーの場合、静的ファイル(.css 、、。js、.jpgファイルなど)のみをキャッシュし、動的ページはキャッシュしません。

このシナリオのキャッシュ構成ルールを設定するにはどうすればよいですか?私は複数の方法を試しました:

  • キャッシュヘッダー:MVCアプリによって送信されたキャッシュ制御ヘッダーはここでは使用できません。これを想像してください:ページ1はARRのキャッシュにあります。ユーザーが認証してページ1にアクセスします。MVCアプリはキャッシュなしのヘッダーを送信しますが、リクエストがそれに到達していないため、ユーザーはキャッシュされたバージョンを取得します。
  • キャッシュなしのURL:「no-arr-cache」を含むURLをキャッシュしないように定義すると、URLの書き換え、つまり、認証されたリクエストを書き換えるカスタムURL書き換えプロバイダーで機能するでしょう...? no-arr-cache。クエリ文字列を考慮しないARRキャッシュ制御ルールとは別に、問題は、ARRが、書き換えられたURLではなく、キャッシュ構成ルールが評価されるときに要求されたURLのみを考慮に入れることです。

前もって感謝します!

IISフォーラム からこれをクロスポストしました。誰も返信しなかったからです。

2
Piedone

これが私がそれを解決した方法です。

次の前提を念頭に置く必要があります。

  • ARRは、キャッシュされたアイテムをURLで識別します(構成によっては、クエリ文字列が含まれます。これは構成である必要があります)。
  • リクエスト中に、現在のリクエストの出力をキャッシュしないようにARRに指示できます。
  • 現在のリクエスト(URL)の出力が以前にキャッシュされていた場合、キャッシュされたバージョンを使用しないようにARRに指示する方法はありません。

大きなアイデアは、リクエストのURLを変更することです。つまり、ユーザーが認証されているかどうかに応じて、IIS URL Rewrite)で別の方法で書き換えます。認証されていないユーザーは、すべてのページに/ my-などが表示されます。 page?authenticated = falseおよび/ my-page?authenticated = trueで認証されたページ。ページは匿名ユーザーに対してのみキャッシュされるため、ARRは認証されたユーザーに一致するキャッシュエントリを見つけられません。したがって、3番目のポイントは解決されます。 URLに添付するクエリ文字列がHTML本文に表示される可能性があることの欠点は、IIS URLRewriteで削除する必要があることです。

現在のリクエストをキャッシュしないようにARRに指示するには、ARR_CACHE_CONTROL_OVERRIDEサーバー変数を「1、no-cache」に設定します(これは書き換えルールから実行できます)。

ユーザーがIIS URL Rewrite IRewriteProvider( tutorial を参照))から認証されているかどうかを検出できます。つまり、そのようなプロバイダーの出力を使用して、URLを別の方法で書き換えることができます。認証された匿名ユーザー向け。

それが誰かを助けることを願っています。

1
Piedone

キャッシュ制御の構成はHTTP/1.1でのみ機能し、古いIEブラウザーのキャッシュを無効にするには、構成する必要があります

  • キャッシュ制御:キャッシュなし
  • プラグマ:キャッシュなし

次の記事では、これについて詳しく説明しています。 ARRでキャッシュを無効にする

0
Randy Nghiem