我试图通过促进ETag来加速一些ajax调用。我现在所做的工作有时候(未修改304的ajax调用需要40ms而不是100ms)。
然而,我注意到的是,Chrome显然只为一个请求发送If-None-Match标头,但 doees永远不会在Windows机器上发送它。这是非常可惜的,因为这是关于我经常加载以检查更改的资源。在这种情况下,让ETag一直工作会非常有用。
以下是电线上发生的事情:
GET /api/book/all/READ HTTP/1.1
Host: something
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept: */*
Referer: http://something/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de,en-US;q=0.8,en;q=0.6
Cookie: PHPSESSID=something
和回复:
HTTP/1.1 200 OK
Date: Mon, 04 Apr 2016 06:00:17 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
ETag: "1"
Cache-Control: "max-age=0, must-revalidate"
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=2, max=995
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json;charset=utf8
(作为旁注,我使用的ETag值是指数据的版本 - 每次修改数据时,版本都会增加)
在下一个请求中,在Mac上,Chrome会发送相应的If-None-Match
标头,并且API将以未经修改的304进行响应。但是,第二次加载资源时,将不再有任何If-None-Match
标头。
在Windows上,Chrome不会发送If-None-Match
标头,因此服务器将使用完整的有效负载进行响应。
我想拥有它的方式是浏览器总是发送If-None-Match
标头,以便后端可以做一个合适的工作来决定缓存的API响应还是新鲜的。
在mac上,这是第二个请求(发送If-None-Match
标头的位置)的样子:
GET /api/book/all/READ HTTP/1.1
Host: something
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept: */*
Referer: http://something/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de,en-US;q=0.8,en;q=0.6
Cookie: PHPSESSID=something
If-None-Match: "1"
和回复:
HTTP/1.1 304 Not Modified
Date: Mon, 04 Apr 2016 05:27:19 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=2, max=1000
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Vary: Accept-Encoding