ARR - 특정 요청(인증된 사용자)에 대한 디스크 캐싱을 동적으로 비활성화합니다.

ARR - 특정 요청(인증된 사용자)에 대한 디스크 캐싱을 동적으로 비활성화합니다.

이는 애플리케이션 요청 라우팅 및 특정 요청에 대한 디스크 캐싱을 동적으로 비활성화하는 것에 관한 것입니다(요청이 인증된 사용자로부터 오는 경우, 인증 여부는 사용자 정의 코드로 결정할 수 있음).

내 설정에는 ARR을 실행하는 서버가 있으며 요청을 다른 서버의 ASP.NET MVC 사이트로 디스패치합니다. 사이트는 양식 인증(때때로 HTTP 기본 인증)을 사용하므로 인증은 ARR이 아닌 MVC 사이트에서 발생합니다. 기본적으로 사용자가 사이트를 인증하면 양식 인증 쿠키가 생성됩니다.

ARR에서 다음이 발생하기를 바랍니다.

  • 익명 사용자에 대한 출력 캐싱을 수행합니다.
  • 인증된 사용자의 경우 정적 파일(예: .css, .js, .jpg 파일)만 캐시하고 동적 페이지는 캐시하지 않습니다.

이 시나리오에 대한 캐시 구성 규칙을 갖는 것이 어떻게 가능합니까? 나는 여러 가지 방법을 시도했습니다:

  • 캐시 헤더: MVC 앱에서 보낸 캐시 제어 헤더는 여기에서 사용할 수 없습니다. 왜냐하면 페이지 1이 ARR의 캐시에 있기 때문입니다. 사용자가 인증하고 페이지 1을 방문합니다. MVC 앱은 캐시 없는 헤더를 보내지만 요청이 도달하지 않으므로 사용자는 캐시된 버전을 얻습니다.
  • 캐시 없음 URL: "no-arr-cache"가 포함된 URL은 캐시되어서는 안 된다고 정의하더라도 URL 재작성이 작동할 것입니다. 즉, 사용자 정의 URL 재작성 공급자를 사용하면 인증된 요청을 ...? 캐시 없음. 쿼리 문자열을 고려하지 않는 ARR 캐시 제어 규칙과는 별도로 문제는 ARR이 캐시 구성 규칙을 평가할 때 다시 작성된 URL이 아닌 요청된 URL만 고려한다는 것입니다.

미리 감사드립니다!

나는 이것을 다음에서 교차 게시했습니다.IIS 포럼왜냐하면 거기에는 아무도 대답하지 않았기 때문입니다.

답변1

이것이 내가 해결한 방법입니다.

우리는 다음과 같은 전제를 염두에 두어야 합니다.

  • ARR은 URL(구성에 따라 쿼리 문자열을 포함하며 이는 구성이어야 함)로 캐시된 항목을 식별합니다.
  • 요청 중에 현재 요청의 출력을 캐시하지 않도록 ARR에 지시할 수 있습니다.
  • 현재 요청(URL) 출력이 이전에 캐시된 경우 ARR에 캐시된 버전을 사용하지 않도록 지시할 방법이 없습니다.

가장 큰 아이디어는 요청의 URL을 변경하거나 사용자의 인증 여부에 따라 IIS URL 다시 쓰기를 사용하여 다르게 다시 작성하는 것입니다. 인증되지 않은 사용자는 /my-page?authenticated=false로 제공되는 모든 페이지를 가져오고 /my-page?authenticated=true로 인증된 페이지를 얻습니다. 페이지는 익명 사용자에 대해서만 캐시되므로 ARR은 인증된 사용자에 대해 일치하는 캐시 항목을 찾지 않습니다. 이로써 세 번째 문제가 해결되었습니다. 단점은 URL에 첨부한 쿼리 문자열이 HTML 본문에 나타날 수 있다는 것입니다. 이러한 문자열은 IIS URL 재작성으로 제거되어야 합니다.

현재 요청을 캐시하지 않도록 ARR에 지시하려면 ARR_CACHE_Control_OVERRIDE 서버 변수를 "1,no-cache"로 설정합니다(재작성 규칙에서 이 작업을 수행할 수 있음).

IIS URL 재작성 IRewriteProvider를 통해 사용자가 인증되었는지 여부를 감지할 수 있습니다(참조:지도 시간), 즉 이러한 공급자의 출력을 사용하여 인증된 사용자와 익명 사용자에 대해 URL을 다르게 다시 작성할 수 있습니다.

누군가에게 도움이 되기를 바랍니다.

관련 정보