2012-03-29 2 views
4

나는 Heroku의 Rails 3.2에서 스트리밍을 시도하고 있습니다. (내 SO 게시물 : Rails 3.2 streaming 참조).Rails 3.2에서 요청별로 랙 캐시를 비활성화 할 수 있습니까?

결론적으로 랙 캐시가 문제의 원인입니다. production.rb에서 config.middleware.delete(Rack::Cache)을 사용하여 비활성화하면 문제를 해결하는 것으로 보입니다. 이것은 분명히 내 전체 앱에서 사용 중지됩니다.

하나의 스트리밍 요청 (관리자쪽에 있으며 자주 사용하지 않음)에만 사용하지 못하도록하고 싶습니다. 이것이 가능한가? 하나의 작은 (그러나 필수적인) 관리 기능을 위해 캐싱을 잃는 것은 큰 실수 일 것입니다.

대단히 감사합니다 !!!

편집 : 문제의 동작을 캐시하지 않도록 헤더를 설정하려고 시도했지만 Rack :: Cache가 여전히 스트리밍에 실패합니다. 완전히 비활성화하면 지금까지 찾은 유일한 해결책입니다.

+0

정말이 질문에서 나를 돕는 것은 실제로 당신이'config.middleware.delete ("Rack :: Cache")'를 사용하여 Rack :: Cache를 비활성화 할 수 있다는 것을 아는 것입니다. (P.S .: Rack :: Cache를 인용 할 필요가 있습니다.) – thekingoftruth

답변

2

랙 캐시를 비활성화 할 필요가 없습니다. 이 응답을 내 응답에 추가하려면 self.response.headers['Last-Modified'] = Time.now.ctime.to_s 해야합니다.

0

해제 할 수는 없지만 수행 할 필요는 없습니다. 캐싱 메커니즘을 우회하면됩니다. 소스 herehere

Cache-Control: no-cache 헤더 또는 Pragma: no-cache 헤더가 설정되어있는 경우, 랙 :: 캐시는 캐시에서 요청을 끌어 시도하지 않습니다. 그렇게해도 사용 중지되지는 않지만 캐싱하지 않아야하는 요청이 캐싱 응답을 반환하지 않도록합니다.

또한, 해당 랙을 보장 할 수 있습니다 : 캐시 같은 뭔가 주어진 행동에 대한 응답 캐시 결코 : 컨트롤러 활동에

response.headers['Cache-Control'] = 'private,max-age=0,must-revalidate,no-store' 

합니다. 이렇게하면 Rack :: Cache (및 다른 모든 업스트림 프록시)가 응답을 캐시하지 않아 백엔드에 항상 신선한 결과를 가져올 수 있습니다.

이 경우 실패하면 context.rb의 forward 메소드로 인해 문제가 발생할 가능성이 있습니다. 그것을 우회하는 방법이없는 것 같기 때문에 특정 헤더가 설정되어있는 경우에만 #call을 호출하기 위해 Rack :: Cache를 패치하고 싶을 것입니다.

+0

불행하게도, 헤더를 설정해도 문제가 해결되지 않는 것 같습니다. Rack :: Cache를 완전히 제거해야 할 것처럼 보입니다. 당신의 패치 아이디어를 조사해 볼게요. 감사! –

+0

최대 연령을 버려야합니다. RFC2616에서 : 요청에 no-cache 지시문이 포함되어 있으면 min-fresh, max-stale 또는 max-age를 포함해서는 안됩니다. – zaius

+0

RFC의 해당 부분은 응답 헤더가 아니라 요청 헤더에 적용됩니다. –

관련 문제