2011-11-15 2 views
0

문제 :내 스크립트를 캐싱하는 크롬 및 기타 브라우저에 다음을 포함하십시오.

사이트의 각 페이지마다 다른 위젯을 클라이언트 웹 사이트에서 호스팅하고 있습니다.

위젯을 렌더링하기 위해 클라이언트는 해당 페이지에 스크립트 태그를 포함합니다. 이 스크립트 태그는 사이트의 모든 페이지에 대해로드되며 반환되는 코드는 페이지에 따라 다릅니다.

따라서이 스크립트가 캐시되면 최종 결과는 잘못된 페이지에 대한 위젯을 제공한다는 것입니다. 우리는 스크립트를 제공 할 때

는 지금, 우리는 때때로 여전히 스크립트를 캐시 브라우저 만 아직 응답 헤더

 
Cache-Control: max-age=0 
Expires : 24 hours in the past 

에서 설정합니다.

질문 :

이 모든 경우에 캐싱을 중지하거나 우리가 완전히 다른 접근을해야 할 것되는 HTTP 헤더를 사용하는 방법이 있나요?

UPDATE :

크게 권장하는 스크립트의 비 캐시 가능성을 향상 topek 헤더가. 그러나 뒤로, 앞으로 또는 다시로드 버튼을 사용할 때 (캐시에서 가장 공격적인 Chrome에서 다시) 스크립트는 여전히 캐시됩니다. 실제로 아무것도 클릭하면 서버에서 가져옵니다.

캐싱을 중지하는 유일한 방법은 각 페이지로드마다 다른 것으로 보장되는 스크립트 소스를 설정하는 것입니다 (esilija 및 tejs에서 제안한 것처럼).

+1

js url 요청에 임의의 쿼리 문자열 매개 변수를 포함시키는 것이 왜 좋을까요? 또는 datetime 또는 뭔가 첨부? – Tejs

+1

은 무의미한 쿼리 문자열을 추가합니다. 이렇게 :'script.js? 14091341049134'. 밀리 초마다 바뀌는 '+ 새 날짜'에서 숫자를 생성하십시오. – Esailija

+0

필요한 경우 수행 할 수 있습니다. 그러나 우리는 고객에게 단일 스크립트 태그를 포함하도록 요청하는 단순함을 좋아합니다. 나는 당신이 제안하는 것을 할 수있는 몇 줄의 j를 포함하도록 요청할 수 있다고 생각합니다. – Hersheezy

답변

1

그 두 헤더는 트릭을 수행해야합니다

response.setHeader("Cache-Control", "no-cache, must-revalidate"); 
response.setHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT"); 

을하거나 현재 페이지, 예에 따라 이름을 설정 사용자가 페이지 http://domain/posts/1을 요청하면 스크립트 이름은 http://domain/script/scriptname/posts/1이 될 수 있습니다. 접근 방식으로 스크립트는 여전히 페이지 당 캐시 가능합니다.

script.js?random_string과 같은 쿼리 문자열을 스크립트에 추가하지 마십시오. 프록시는이 접근법으로는 잘 작동하지 않습니다. 이름에 임의의 문자열을 넣으려면이 script-0934234234.js과 같이 .js 앞에 넣고 서버에 요청을 다시 작성하십시오.