2008-10-08 5 views
9

프로덕션 모드에서 레일스 애플리케이션을 배포 할 때 모든 정적 애셋 URL의 끝 부분에 쿼리 매개 변수로 날짜 - 시간 문자열을 추가합니다. 이는 응용 프로그램을 재배포 한 후에 오래된 애셋 사본을 사용하는 브라우저를 방지하기위한 것입니다.레일 캐시에서 캐시 무효화 제거

마지막 배포 이후에 변경되지 않은 자산 (예 : 만 해당)에 대해 이전 타임 스탬프를 사용하도록하는 방법이 있습니까? 사용자가 변경되지 않은 애셋을 다시 다운로드하지 못하게하려면이 작업을 수행하고 싶습니다.

+2

레일 3.1에서 레일스는 타임 스탬프가 아닌 MD5를 사용하므로이 질문은 더 이상 의미가 없습니다. 2 년 전 –

답변

6

ENV [ 'RAILS_ASSET_ID']를 사용하여 캐시 무효화 자산 ID를 변경할 수 있다고 생각합니다. 불행히도 이는 모든 자산에 적용됩니다.

그러나 설정되지 않은 경우 자산의 소스 수정 시간을 사용합니다. 해당 파일을 마지막으로 사용한 후 수정되지 않은 경우 문제가되지 않습니다.

자산 ID가 변경되지 않은 경우 자산 ID가 변경되는 것은 배포 프로세스가 수정 시간을 변경했기 때문일 수 있으며이를 조정할 수 있습니다.

마지막으로 항상 override rails_asset_id with your own custom method이 될 수 있습니다.

희망이 도움이됩니다.

0

@Aupajo 나는 이것을 좋아하지만 나는 그걸 조금 더 생각할 수 있다고 생각한다. 여기서 문제는 capistrano가 모든 배포시 모든 파일의 새로운 복사본을 생성하므로 캐시가 파열되는 모든 문자열이 변경된다는 것입니다. 그러나 파일의 MD5는 파일 내용이 변경 될 때만 변경됩니다.

물론 MD5를 생성하는 작업은 비용이 많이 들지 않고 느리지 만 memcache에있는 파일의 MD5를 캐시 할 수 있습니다 (변경 시간을 입력하면 MD5가 변경된 것처럼) 이 변경되었지만 타임 스탬프는

를 변경하지 않습니다 MD5 변경되지 않았습니다
13

카피 스트라 노 기본적으로,이 모든 모든 자산이 변경 및 브라우저 줘야 생각 레일을 배포 한 후 의미, 당신이 말한대로.에 '자산'을 고려 모든 파일을 터치 매번 새로운 버전을 다운로드하십시오.

다음 설정으로 카피스트라 노에서 이것을 비활성화 할 수 있습니다 :

set :normalize_asset_timestamps, false 

SVN을 사용하는 경우 파일의 수정 날짜는 저장소에서 마지막으로 수정 된 날짜를 반영해야하므로 완벽해야합니다.

아파치를 사용하고 있다면, 이와 같은 것을 추가하여 실제로 캐싱을 할 수 있습니다. 이렇게하면 브라우저가 "캐시 제어"지시어에 의존하도록 알리는 데 도움이됩니다. 이는 캐시 된 자산을 알고있는 경우 캐시 요청을 요청할 필요가 없기 때문입니다.

#Etags should be based on the file parameters only (default includes INode) 
FileETag MTime Size 

#Rewrite stuff 
RewriteEngine On 

#This sets the environment variable (is_versioned) when the URL query string 
#looks like ?874353948543 or any string of digits 
RewriteCond %{QUERY_STRING} ^[0-9]+$ 
RewriteRule ^(.*)$ $1 [env=is_versioned:true] 

<Directory /deployed-rails-app/public/ > 
    Options -Indexes FollowSymLinks -MultiViews 
    AllowOverride None 
    Order allow,deny 
    allow from all 

    #For files, force the browser to rely on cache-control directives and 
    #Rails asset timestamps by removing Etags and Last-Modified dates 

    #For all assets that aren't stamped by rails, cache them for ~ 3 hours 
    Header set "Cache-Control" "max-age=10000" 
    Header unset Etag 
    Header unset "Last-Modified" 

    #For all assets that ARE stamped by rails, cache them for 30 days 
    Header set "Cache-Control" "max-age=2592000" env=is_versioned 

</Directory> 

내 프로덕션 서버까지이 방법을 설정하고 현재 방문자는 동적 콘텐츠 및 모든 자산 (~ 40-50)을 반환 하나 개의 요청 (가져 오기 /)을 수행 반환 한 캐시됩니다.

+0

성스러운 아보카도 원? 왜 아무도이 솔루션을 포주가하지 못했습니다. 모든 요청의 URL에 (단순한) regex를 실행하는 오버 헤드 외에도, 나는 그것을 좋아한다. – sbeam