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 правильный заголовок запроса?
Что я могу изменить?
Спасибо!
Ответы
Ответ 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 для меня.