2008-10-08 33 views
9

Khi tôi triển khai một ứng dụng đường ray trong chế độ sản xuất, nó thêm chuỗi ngày tháng làm tham số truy vấn vào cuối tất cả các url nội dung tĩnh. Điều này nhằm ngăn các trình duyệt sử dụng các bản sao cũ của các tài sản cũ sau khi tôi triển khai lại ứng dụng.Loại bỏ Cache Busting trong Rails Production

Có cách nào để làm cho đường ray sử dụng tem thời gian cũ cho nội dung không thay đổi (và chỉ những cái chưa thay đổi) kể từ lần triển khai cuối cùng. Tôi muốn thực hiện việc này để ngăn người dùng phải tải xuống lại những nội dung chưa thay đổi.

+2

Lưu ý rằng đối với đường ray 3.1 Đường ray sử dụng MD5 thay vì Dấu thời gian, có nghĩa là câu hỏi này không còn relavent nữa. –

Trả lời

6

Tôi nghĩ rằng bạn có thể sử dụng ENV ['RAILS_ASSET_ID'] để thay đổi ID nội dung chặn truy xuất bộ nhớ cache. Thật không may, điều này là dành cho tất cả các tài sản.

Nhưng nếu chưa được đặt, nó sẽ sử dụng thời gian sửa đổi nguồn của nội dung. Nếu tệp đó chưa được sửa đổi kể từ lần cuối bạn sử dụng, nó không phải là vấn đề.

Nếu ID nội dung đang thay đổi khi chúng không bị thay đổi, có thể là do quy trình triển khai của bạn thay đổi thời gian sửa đổi và có thể bạn có thể xem xét điều chỉnh đó.

Cuối cùng, bạn luôn có thể override rails_asset_id with your own custom method.

Hy vọng điều này sẽ hữu ích.

0

@Aupajo Tôi thích điều này, nhưng tôi nghĩ tôi có thể tiến xa hơn một chút. Vấn đề ở đây là capistrano tạo ra các bản sao mới của tất cả các tệp trên mỗi lần triển khai, vì vậy tất cả các chuỗi bộ nhớ cache được thay đổi. Tuy nhiên, MD5 của tệp sẽ chỉ thay đổi khi nội dung tệp thay đổi.

Tất nhiên, tạo ra một MD5 là tốn kém và chậm, nhưng bạn có thể bộ nhớ cache MD5 của một tập tin trong memcache, (keyed vào thời gian thay đổi, như thể thời gian đã làm thay đổi MD5 thể đã thay đổi, nhưng nếu dấu thời gian đã không thay đổi MD5 sẽ không đã thay đổi

13

Capistrano, theo mặc định, chạm vào tất cả các file đó coi một 'tài sản'. Như bạn nói, điều này có nghĩa sau mỗi lần triển khai đường ray nghĩ mọi nội dung đã thay đổi và các trình duyệt wil tải xuống phiên bản mới hơn mỗi lần

Bạn có thể tắt tính năng này trong Capistrano bằng cài đặt sau

set :normalize_asset_timestamps, false 

Nếu bạn đang sử dụng SVN thì ngày sửa đổi cho tệp của bạn phải phản ánh ngày chúng được sửa đổi lần cuối trong kho lưu trữ của bạn, vì vậy sẽ hoàn hảo.

Nếu bạn đang sử dụng Apache, bạn có thể thêm một cái gì đó như thế này để thực sự làm cho bộ nhớ đệm làm việc cho bạn. Điều này giúp bằng cách yêu cầu trình duyệt dựa vào chỉ thị "Kiểm soát bộ nhớ cache" có nghĩa là nếu nó biết nội dung được lưu trong bộ nhớ cache, nó thậm chí sẽ không làm phiền yêu cầu nó.

#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> 

Tôi đã đặt máy chủ sản xuất của mình theo cách này và hiện tại khách truy cập chỉ thực hiện một yêu cầu (Get /) trả về nội dung động và tất cả nội dung (~ 40 - 50) được lưu vào bộ nhớ cache.

+0

guacamole thánh, hai năm trước? tại sao không ai pimped giải pháp này. Ngoài việc chạy một regex (đơn giản) trên mọi URL của yêu cầu, tôi thích nó. – sbeam

Các vấn đề liên quan