Подтвердить что ты не робот

Safari не отправляет заголовки "If-Modified-Since" и "If-None-Match"

Я создаю динамический контент с PHP.

Я отправляю следующий HTTP-заголовок:

HTTP/1.1 304 Not Modified
Date: Sun, 09 Dec 2012 17:24:41 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=100
Etag: "237f43b800e655dbe6567f7d32d34c99"
Expires: Sun, 16 Dec 2012 17:24:41 GMT
Cache-Control: max-age=604800
Vary: Accept-Encoding

Позднее я проверю, чтобы Etag отправил header('HTTP/1.1 304 Not Modified'), если он соответствует. Это отлично работает с Chrome и Firefox. Однако Safari (версия 6.0.2) не отправляет заголовки "If-Modified-Since" и "If-None-Match". Это заголовок запроса, отправленный Safari на второй странице:

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Cache-Control: max-age=0

Все другие файлы, связанные с этой страницей, получают правильные заголовки запросов и Safari, используемые кешированными файлами или 304, где это необходимо.

Почему не отправляет Safari правильный заголовок запроса? Что я могу изменить?

Спасибо!

4b9b3361

Ответ 1

If-Modified-Since

Заметки If-Modified-Since предостерегают от использования чего-то другого, чем содержимое заголовка ответа Last-Modified:

Примечание. Если клиент использует произвольную дату в If-Modified-Since       вместо даты, взятой из заголовка Last-Modified для       тот же запрос, клиент должен знать о том, что этот       дата интерпретируется в понимании сервером времени.

В вашем ответе не содержится Last-Modified, но даже если это так, ничего в спецификации не говорит о том, что пользовательские агенты ДОЛЖНЫ или СЛЕДУЕТ send If-Modified-Since, они просто МОГУТ.

If-None-Match

Что касается того, почему Safari не отправляет If-None-Match, меня бьет; ваш ETag выглядит действительным.

Выполнение кэширования вообще

Снова вообще ничего в спецификации не говорит, что вы ДОЛЖНЫ кэшировать, просто, когда вы это делаете, вы ДОЛЖНЫ подчиняться Cache-Control. Таким образом, это немного асимметричное отношение, вы можете применять (прозрачные) кеши, чтобы перепроверять исходный сервер, но в качестве исходного сервера вы не можете принуждать пользователя к кешированию.

Что я могу сделать с этим?

Safari - это частично бесплатное программное обеспечение. Так что ничего, если добавление Last-Modified не помогает.

Ответ 2

Я решил решить эту проблему, посмотрев, какие заголовки отправлены различными крупными сайтами, и закончил с

Last-Modified: {some date}
Cache-Control: max-age=0, must-revalidate
Expires: -1

Это работает для Safari для меня.