Tôi không thể hình dung điều này cho cuộc sống của tôi. Đang cố gắng sử dụng Rack :: Cache để cache một số trang công cộng tĩnh của tôi trên Heroku, ngoài việc thực hiện bộ nhớ đệm hành động trong trường hợp nó vượt qua proxy ngược lại.Heroku Cedar Stack - Tiêu đề bộ nhớ cache giá
Ví dụ, đây là mã trong "nhà" của tôi hành động:
class StaticPagesController < ApplicationController
layout 'public'
caches_action :about, :contact, ......, :home, .....
......
def home
last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml")
fresh_when last_modified: last_modified , public: true, etag: last_modified
expires_in 10.seconds, :public => true
end
Đối với tất cả các tính năng, điều này nên có một thẻ nhớ cache kiểm soát công cộng với 10 max-age không?
$ curl -I http://myapp-staging.herokuapp.com/
HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: text/html; charset=utf-8
Date: Thu, 24 May 2012 06:50:45 GMT
Etag: "997dacac05aa4c73f5a6861c9f5a9db0"
Status: 200 OK
Vary: Accept-Encoding
X-Rack-Cache: stale, invalid
X-Request-Id: 078d86423f234da1ac41b418825618c2
X-Runtime: 0.005902
X-Ua-Compatible: IE=Edge,chrome=1
Connection: keep-alive
Tôi đang làm điều gì đó khủng khiếp sai? Tôi cảm thấy như có cái gì đó với câu trả lời bộ nhớ cache cũ, không hợp lệ ... đó là lần thứ 4 tôi đã truy cập trang.
Config Thông tin:
# Use a different cache store in production
config.cache_store = :dalli_store
config.action_dispatch.rack_cache = {
:verbose => true,
:metastore => "memcached://#{ENV['MEMCACHE_SERVERS']}",
:entitystore => "memcached://#{ENV['MEMCACHE_SERVERS']}"#,
}
# OLD : Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = true
config.static_cache_control = "public, max-age=2592000"
(? Có thể có một cách để tự đặt tiêu đề bộ nhớ cache kiểm soát Có vẻ như không nên có một cách dễ dàng hơn mặc dù).
CẬP NHẬT
Tôi thậm chí đã cố gắng thực hiện hành động điều khiển xuống đến mức tối thiểu:
def home
expires_in 10.seconds, :public => true
#last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml")
#fresh_when last_modified: last_modified , public: true, etag: last_modified
end
Và nó không hoạt động ...
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 24 May 2012 19:15:18 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Status: 200 OK
X-Ua-Compatible: IE=Edge,chrome=1
Etag: "733798214c652f39ae79b4037e9111dc"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: b33087fe0c2ae986c4cac88f14420b7c
X-Runtime: 0.006000
X-Rack-Cache: stale, invalid
Vary: Accept-Encoding
X-Varnish: 349105873
Age: 0
Via: 1.1 varnish
!
Điều này thậm chí có thể thực hiện với bộ nhớ đệm hành động không? Bạn đã thử nghiệm nó với bộ nhớ đệm trang chỉ để xem các tiêu đề khác nhau như thế nào? – KendallB
hmmm Tôi thấy quan điểm của bạn. Nếu Rack :: Cache được thiết lập đúng để phục vụ các trang (không phải là phương pháp sạch nhất, nhưng tốt nhất bạn có thể làm trên Heroku), tôi thực sự không nên có bất cứ điều gì trong đó cho các hành động caching. Tôi cho rằng tôi chỉ có điều đó ở đó để có biện pháp tốt. Tôi sẽ thử lấy nó ra và xem chuyện gì xảy ra. Tôi sẽ gửi lại cho bạn. – Brandon
Vì vậy, có vẻ như bạn đã đúng. Khi tôi thực hiện thao tác lưu vào bộ nhớ cache, tiêu đề đã được đặt chính xác. Tôi không biết rằng tôi nhất thiết phải hiểu điều này mặc dù. Không nên đặt tiêu đề phản hồi HTTP tách biệt với bộ nhớ đệm kết quả của một hành động? Tức là, tôi không thể lưu trữ phản hồi của ứng dụng đường ray (bộ nhớ cache hành động) nhưng vẫn đặt tiêu đề HTTP sao cho nếu người dùng yêu cầu lại trang, họ không truy cập vào máy chủ (cung cấp cài đặt chính xác trên tiêu đề tối đa?) – Brandon