Как сделать так, чтобы Safari отправлял заголовок if-Modified-Since? - PullRequest
2 голосов
/ 11 апреля 2011

Когда я генерирую страницу, я отправляю заголовки

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Last-Modified: Mon, 04 Apr 2011 20:08:33 GMT
Vary: Accept-Encoding
Date: Mon, 11 Apr 2011 01:36:21 GMT
Content-Length: 3019

, затем, когда я пытаюсь получить эту страницу снова, все браузеры отправляют правильный запрос и получают ответ 304, кроме Safari - он никогда не отправляет if-Modified-Since,Он всегда перезагружает всю страницу, даже если она не была изменена

Известно ли это поведение Safari и что нужно сделать, чтобы Safari работал правильно?

Ответы [ 4 ]

1 голос
/ 22 октября 2014

Я столкнулся с этим с 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
1 голос
/ 27 апреля 2011

Барт Лэйтер написал сообщение об этом с параграфом, в котором говорится о Safari:

Safari делает еще один шаг вперед: если заголовок не является датой в стандартной форме http, тогда заголовок просто удаляется. Он просто не отправляет заголовок If-Modified-Since при следующем запросе.

0 голосов
/ 18 августа 2017

В моем тестировании Safari ожидает заголовок «Expires» или «Cache-Control» вместе с «Last-Modified».

Cache-Control: max-age=0, private
Last-Modified: Thu, 17 Aug 2018 12:04:23 GMT

Или,

Expires: Thu, 17 Aug 2018 12:04:23 GMT
Last-Modified: Thu, 17 Aug 2018 12:04:23 GMT

ПРИМЕЧАНИЕ: «Максимальный возраст» был необходим для Safari, чтобы соблюдать «Последнее изменение»

0 голосов
/ 24 апреля 2014

Safari является только частично бесплатным программным обеспечением.Кроме того, что вы затаили дыхание до тех пор, пока Apple не выпустит весь Safari как бесплатное программное обеспечение, в качестве пользователя Safari вы можете использовать прокси-сервер кэширования и настроить его так, чтобы нарушать спецификации и игнорировать заголовки Cache-Control, отправляемые Safari.имеет директиву refresh_pattern , и я уверен, что другие прокси-серверы имеют аналогичную функциональность.

Затем вы можете настроить Safari на использование прокси-сервера или сделать это прозрачно в духе вверх-вниз ternet .

...