rails 4 http 缓存返回 200 iso 304,即使使用相同的 ETag 和 last_modified
rails 4 http caching returning 200 iso 304, even with the same ETag and last_modified
我对缓存还很陌生,所以我一直在尝试一些不同的方法来缓存我的网站。我现在决定使用 HTTP 缓存,因为它最适合零星的更新,而且很多用户一遍又一遍地阅读相同的页面。
但是我正在努力让它工作。该站点根据您是否登录显示不同的内容,因此我必须根据 current_user 以及模型 collection 的最新更新使缓存无效。
如果我查看 chrome 检查 ETag 和 modified_since 是相同的,但服务器 returns 是 200 而不是 304。我的代码在开发环境中工作,所以我不知道如何解决它。还有一个仅根据 collection 模型(与最新更新类似)无效的不同页面,确实按预期工作。
来自控制器的代码:
def index
...#some code
# HTTTP caching:
last_mod = @scraps.order("updated_at").last.updated_at
user = current_user ? current_user.id : 0
fresh_when etag: user.to_s, last_modified: last_mod, public: false
end
来自chrome检查的输出
回复Headers:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK
Last-Modified: Sun, 23 Jul 2017 20:40:53 GMT
Cache-Control: max-age=0, private, must-revalidate
ETag: W/"6e92592bdb6c3cf610020e2b076e64b4"
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Runtime: 3.187090
X-Request-Id: c698c0c6-8a0d-44ba-8ca9-3f162b766478
Date: Mon, 24 Jul 2017 14:49:38 GMT
Set-Cookie: ... [edited out]; path=/; HttpOnly
X-Powered-By: Phusion Passenger 5.0.30
Server: nginx/1.10.1 + Phusion Passenger 5.0.30
Content-Encoding: gzip
请求Headers:
GET /scraps?page=3&price_max=100&price_min=0&producer=silk+scraps HTTP/1.1
Host: www.picture-scraps.com
Connection: keep-alive
Accept: text/html, application/xhtml+xml, application/xml
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
X-XHR-Referer: https://www.picture-scraps.com/scraps?page=4&price_max=100&price_min=0&producer=silk+scraps
Referer: https://www.picture-scraps.com/scraps?page=4&price_max=100&price_min=0&producer=silk+scraps
Accept-Encoding: gzip, deflate, br
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4,af;q=0.2
Cookie: ... [edited out]
If-None-Match: W/"6e92592bdb6c3cf610020e2b076e64b4"
If-Modified-Since: Sun, 23 Jul 2017 20:40:53 GMT
我可以想象需要一些额外的信息,所以请提出要求,我会添加到问题中。
今天想通了。 This post 提供了答案。我看到服务器使用了弱 etags,而在开发环境中使用了强 etags。后者符合预期,因为弱 etags 仅从 rails 5 开始引入。
如果您将 Nginx 与 rails 4 一起使用,您可能会遇到同样的问题。安装 rails_weak_etags gem 为我解决了这个问题。
我对缓存还很陌生,所以我一直在尝试一些不同的方法来缓存我的网站。我现在决定使用 HTTP 缓存,因为它最适合零星的更新,而且很多用户一遍又一遍地阅读相同的页面。
但是我正在努力让它工作。该站点根据您是否登录显示不同的内容,因此我必须根据 current_user 以及模型 collection 的最新更新使缓存无效。
如果我查看 chrome 检查 ETag 和 modified_since 是相同的,但服务器 returns 是 200 而不是 304。我的代码在开发环境中工作,所以我不知道如何解决它。还有一个仅根据 collection 模型(与最新更新类似)无效的不同页面,确实按预期工作。
来自控制器的代码:
def index
...#some code
# HTTTP caching:
last_mod = @scraps.order("updated_at").last.updated_at
user = current_user ? current_user.id : 0
fresh_when etag: user.to_s, last_modified: last_mod, public: false
end
来自chrome检查的输出
回复Headers:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK
Last-Modified: Sun, 23 Jul 2017 20:40:53 GMT
Cache-Control: max-age=0, private, must-revalidate
ETag: W/"6e92592bdb6c3cf610020e2b076e64b4"
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Runtime: 3.187090
X-Request-Id: c698c0c6-8a0d-44ba-8ca9-3f162b766478
Date: Mon, 24 Jul 2017 14:49:38 GMT
Set-Cookie: ... [edited out]; path=/; HttpOnly
X-Powered-By: Phusion Passenger 5.0.30
Server: nginx/1.10.1 + Phusion Passenger 5.0.30
Content-Encoding: gzip
请求Headers:
GET /scraps?page=3&price_max=100&price_min=0&producer=silk+scraps HTTP/1.1
Host: www.picture-scraps.com
Connection: keep-alive
Accept: text/html, application/xhtml+xml, application/xml
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
X-XHR-Referer: https://www.picture-scraps.com/scraps?page=4&price_max=100&price_min=0&producer=silk+scraps
Referer: https://www.picture-scraps.com/scraps?page=4&price_max=100&price_min=0&producer=silk+scraps
Accept-Encoding: gzip, deflate, br
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4,af;q=0.2
Cookie: ... [edited out]
If-None-Match: W/"6e92592bdb6c3cf610020e2b076e64b4"
If-Modified-Since: Sun, 23 Jul 2017 20:40:53 GMT
我可以想象需要一些额外的信息,所以请提出要求,我会添加到问题中。
今天想通了。 This post 提供了答案。我看到服务器使用了弱 etags,而在开发环境中使用了强 etags。后者符合预期,因为弱 etags 仅从 rails 5 开始引入。
如果您将 Nginx 与 rails 4 一起使用,您可能会遇到同样的问题。安装 rails_weak_etags gem 为我解决了这个问题。