【发布时间】:2017-04-13 16:35:05
【问题描述】:
我希望应用程序响应代码 304 而不是 200。 但即使 IF-NONE-MATCH 等于 ETAG 它也不会发生。
我使用 'Cache-Control: no-cache' 来不将响应存储在缓存中以进行每次验证。否则 Chrome 会使用它的磁盘缓存,这是不可接受的。
请求:
GET /api/v4/record/11728 HTTP/1.1
Host: host.domain.com
Connection: keep-alive
Authorization: Basic YWRtaW467Uc2Zs0eTIwMTM=
Origin: https://host.domain.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: application/json, text/plain, */*
DNT: 1
Referer: https://host-ui.domain.com/some_page
Accept-Encoding: gzip, deflate, sdch, br
If-None-Match: W/"39dcd8467e47701a69c617333f7b6dac"
If-Modified-Since: Thu, 13 Apr 2017 16:09:25 GMT
Name
回应:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS
Access-Control-Allow-Origin: https://host-ui.domain.com
Cache-Control: no-cache
Content-Encoding: gzip
Content-Type: application/json; charset=utf-8
Date: Thu, 13 Apr 2017 16:20:31 GMT
ETag: W/"39dcd8467e47701a69c617333f7b6dac"
Last-Modified: Thu, 13 Apr 2017 16:09:25 GMT
Server: nginx/1.8.1 + Phusion Passenger 4.0.60
Status: 200 OK
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Powered-By: Phusion Passenger 4.0.60
X-Request-Id: ab87433e-62bd-437f-ad7c-0e1d3f95257b
X-Runtime: 0.209121
X-XSS-Protection: 1; mode=block
transfer-encoding: chunked
Connection: keep-alive
在应用程序中常见的动作如下:
def action
record = Model.find(params['id'])
if stale?(record)
hard_work_result = to_do_somethig
render json: {
success: 0,
result: hard_work_result
}
end
end
【问题讨论】:
-
您能否检查
If-None-MatchHTTP 标头实际上可用于控制器操作? MiniProfiler 等代理和中间件可能会删除缓存相关的 HTTP 标头。检查Rails caching: stale? always returns true in development 和Reading header data in rails 讨论。 -
是的,它可用。而且我在开发模式下具有正确的行为。当然 MiniRackProfiler 也被禁用了。
-
你使用哪个版本的 Rails 框架?
-
它是rails 4.2.8。看标签
标签: google-chrome ruby-on-rails-4 browser-cache