Я столкнулся с этим с Safari 8.0. Несмотря на предоставление заголовка Last-Modified
в Safari, он не будет предоставлять заголовок If-Modified-Since
при последующих запросах. Исправление в моем случае заключалось в том, чтобы дополнительно установить заголовок Expires
на ту же html-дату, что и заголовок Last-Modified
.
Вот пример того, как выглядит успешный обмен:
Первоначальный запрос
Стандартный первый запрос от Safari.
GET http://localhost/image
Host: localhost
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Первоначальный ответ
Я указываю заголовки Expires
и Last-Modified
как одну и ту же действительную html-дату. Я не пробовал, но сомневаюсь, что Safari соблюдает заголовок Expires
, установленный на -1
.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Expires: Thu, 17 Jul 2014 19:50:58 GMT
Last-Modified: Thu, 17 Jul 2014 19:50:58 GMT
Content-Type: image/png
Content-Length: 1143902
Date: Wed, 22 Oct 2014 15:33:40 GMT
<<DATA>>
Последующий запрос
Наконец, Safari предоставляет необходимый заголовок If-Modified-Since
.
GET http://localhost/image
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-Modified-Since: Thu, 17 Jul 2014 19:50:58 GMT
Последующий ответ
Я могу с удовольствием вернуть 304.
HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
Expires: Thu, 17 Jul 2014 19:50:58 GMT
Last-Modified: Thu, 17 Jul 2014 19:50:58 GMT
Date: Wed, 22 Oct 2014 15:33:43 GMT