Почему Rack :: Cache не работает с кешем при совпадении etag? - PullRequest
1 голос
/ 05 марта 2010

Запуск без кеша на сервере или клиенте

ПЕРВЫЙ ЗАПРОС

GET /post/1 HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 05 Mar 2010 09:05:46 GMT
Last-Modified: Thu, 04 Mar 2010 21:00:08 GMT
X-Rack-Cache: miss
Etag: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=3600, public

Кэш пропущен, и Rails получает доступ и запрашивает базу данных:

if stale?(:etag => @document, :last_modified => @document.updated_at.utc) # => true
  expires_in 1.hour, :public => true
  @post = Post.find(params[:id])
end

ВТОРОЙ ЗАПРОС

GET /post/1 HTTP/1.1
If-Modified-Since: Thu, 04 Mar 2010 21:00:08 GMT
If-None-Match: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=0

HTTP/1.1 304 Not Modified
Date: Fri, 05 Mar 2010 09:10:04 GMT
X-Rack-Cache: miss
Etag: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=3600, public

Кэш пропущен, а Rails получен, но на этот раз он отправляет 304 Not Modified, а база данных не удаляется:

if stale?(:etag => @document, :last_modified => @document.updated_at.utc) # => false
  expires_in 1.hour, :public => true
  @post = Post.find(params[:id])
end

Однако у меня сложилось впечатление, что это должно ударить в кэш, так как этаг соответствует (If-None-Match / Etag)?

Ответы [ 2 ]

4 голосов
/ 05 марта 2010

Я делаю полное обновление (F5), поэтому браузер добавляет Cache-Control: max-age = 0, что не позволяет кешу думать, что страница свежая.

0 голосов
/ 03 марта 2011

Насколько я понимаю, заголовки If-None-Match и If-Modified-Since отправляются, когда срок действия кэшированного содержимого браузера истекает (содержимое было в кэше браузера больше, чем максимальное значение в заголовке Cache-Control). Это позволяет вашему приложению проверить, что содержимое еще свежо, и если оно есть, отправьте 304 с новым максимальным значением и тем же тегом Etag, что и раньше.

...