Как получить caches_action для установки заголовков expires, когда в memcached есть попадание? - PullRequest
2 голосов
/ 09 августа 2009

У меня есть действие, которое я кеширую, используя

caches_action :my_action, :expires_in=>1.hours

, а также установите заголовки expires в самом действии, используя

def my_action
   ...
   expires_in 1.hours
   send_data(...,:disposition => 'inline',:type => 'image/png',:filename => params[:title]+".png")
end

Однако, когда я смотрю на заголовок ответа управления кэшем из результата, который приходит в результате попадания в memcached, я получаю это:

Cache-Control: private, max-age=0, must-revalidate

Первый раз, то есть когда в кеше ничего нет, это то, что я ожидаю, т. Е .:

Cache-Control: max-age=3600, private

Похоже, что rails + memcached не кэширует оригинальные заголовки ответа и не устанавливает соответствующие заголовки самостоятельно. В результате клиент делает запрос к серверу каждый раз, даже если результат (изображение) не изменился. Хотя действие завершается быстро, поскольку оно получает попадание в кэш, оно все равно завершает отправку всех данных снова, чего я бы хотел избежать.

Как заставить заголовки делать правильные вещи, чтобы клиент либо не делал запросов в первую очередь, либо получал ответ «не изменен»?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2013

У меня была та же самая проблема несколько дней назад. При отладке кажется, что rails не учитывает expires_in для caches_action.

То, что я обнаружил, работает, помещая то же самое в cache_path. Например, настойчиво делать

caches_action :monthly_sales_by_category, :expires_in => 10.minutes, :cache_path => proc { |c|
    category = c.params[:category]
    {:cat => category}
}

я сделал следующее

caches_action :monthly_sales_by_category, :cache_path => proc { |c|
    expires_in 10.minutes, :public => false
    category = c.params[:category]
    {:cat => category} 
}

И работает как шарм. :)

0 голосов
/ 10 августа 2009

Убедитесь, что ваша среда настроена для поддержки кэширования. Так что в config / environment / development.rb (или где-либо еще) вы должны увидеть:

config.action_controller.perform_caching = true

Кроме того, тег приватного кэша указывает промежуточным серверам кэша не хранить контент. Это безопасно по умолчанию. Если вы хотите изменить это поведение, просто установите ваш кэш следующим образом:

expires_in(1.hours, :private => false, :public => true)

Чтобы пропустить дорогостоящую обработку на сервере, если содержимое не изменилось, используйте:

if stale?(:etag => @model, :last_modified => @model.updated_at.utc)
  # Expensive stuff in here.
  respond_to do |format|
    ...
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...