2012-06-13 1 views
4

내 애플리케이션에서 사용자는 사이트의 CSS를 수정할 수 있습니다.출력 캐싱이 동적으로 생성됨 CSS

이렇게 자주 변경하지는 않지만 그럴 경우 해당 방문자와 사이트 방문자가 즉시 결과를 볼 수 있도록해야합니다.

사용자가 CSS를 업데이트 한 날짜와 시간을 기록하여 URL에 타임 스탬프를 추가하기 만하면됩니다.

그러나 변경된 경우 브라우저가 프로그래밍 방식으로 CSS 헤더를 다시 요청하도록 캐시 헤더를 설정할 수 있는지 알고 싶습니다.

답변

4

당신이 당신의 URL에 해시를 포함하는 경우, 즉

http://server.example.com/styles/css.css?hash 

가 다시로드받을 때 브라우저가 새 URL에서 그것을 가져 오기 때문에 해시 변경 :

버전 1 :

<style type="text/css" link="styles/css.css?hash=v1" /> 

버전 2 :

<style type="text/css" link="styles/css.css?hash=v2" /> 

클라이언트 캐싱은 클라이언트 문제입니다. 새로운 URL은 resource가 변경되었음을 의미하므로 다시로드해야합니다. 캐시 제어 헤더를 사용하여 동일한 URL을 유지하면 다양한 클라이언트 구현으로 인해 많은 어려움이 발생할 수 있습니다.

당신이 캐시 제어 헤더 (마지막으로 수정 된 만료, ETAG)를 두는 경우에, 당신은 당신이 변경 될 때 새로 얻을 것이다 CSS 확신 할 수 없습니다 공격적인 브라우저 (또는 프록시) 캐싱을 무시할 수

  • 때문에 그.
  • 5 월 1 일에 V1을 제공하고 만료일을 6 월 1 일로 설정하고 5 월 15 일에 V2로 업데이트하면 고객이 새 버전을 받으려면 15 일을 기다려야하기 때문입니다.

URL 해시가있는 최악의 시나리오는 클라이언트가 캐시에 캐시를 넣지 않지만 항상 최신 버전을 얻으므로 사용자 환경이 변경되지 않는다는 것입니다. 유효 기간 또는 마지막으로 수정 한 날짜와

가, 최악의 경우 클라이언트가 이전 버전을 얻을 수 있다는 것입니다, 이것은 내가 출력 캐싱의 조합을 사용하고 마티유의 응답에 대한 사용자 경험 :

+0

제 질문을 다시 읽어주십시오. URL에 뭔가를 추가 할 수 있지만 캐시 헤더를 설정하여이를 수행하는 방법을 알고 싶습니다. –

+0

이것은 동일하지 않습니다. 캐시 헤더는 응답의 일부입니다. url이 요청을 시작합니다. – mathieu

+0

업데이트 된 답변에 감사드립니다. 클라이언트가 캐시를 마지막으로 수정 한 날짜를 존중하지 않습니까? –

1

감사를 변경하고 캐시 무효화를 처리하는 버전 번호.

출력 캐시 프로필 :

내가 타임 스탬프를 추가하기위한 다음과 같은 확장 방법을 만들어 :

public static string AppendTimeStamp(this string src, DateTime lastModified) 
    { 
     if (string.IsNullOrEmpty(src)) 
      return src; 

     return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss")); 
    } 

사용법 : 당신이 돈의 경우

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/> 

' 당신은 단지 DateTime.UtcNow을 전달할 수있는 파일을 캐시하고 싶지 않습니다. 마지막으로 수정 한 날짜.