В HTTP-протоколах версии 1.0 и 1.1 имеются специальные средства, позволяющие проверять, нужно ли обновить документ, который хранится в кеше у клиента. В случае если страница не изменялась, существует возможность выдать только заголовок со статусом 304 и тем самым сэкономить траффик, а в ряде случаев и разгрузить сервер за счет того, что выполнение скрипта в такой ситуации можно завершить раньше.
В HTTP 1.0 такими средствами является пара заголовков Last-modified/If-Modified-Since, в HTTP 1.1 к ним добавляются заголовки ETag/If-None-Match.
Работают эти средства следующим образом: при первом обращении клиента сервер выдает запрошенный документ и поле заголовка Last-Modified, в котором указывает дату последней модификации документа. (Для статики это время последнего изменения файла, которое хранится в файловой системе, для динамически генерируемого контента о хранении этой даты придется позаботиться разработчику скрипта.) При повторных обращениях к этому же документу клиент передает в заголовке поле If-Modified-Since, в котором указывает дату модификации копии документа в своем кеше. Скрипт, выполняющийся на сервере, сравнивает полученную дату с датой модификации данного документа на сервере, и если документ не изменился (т.е. дата на сервере меньше или равна дате на клиенте), может выдать статус 304 и завершить работу, не производя генерации документа заново.
Пара заголовков ETag/If-None-Match работает аналогично, только вместо даты используется заключенная в кавычки произвольная строка (метка), характеризующая документ. На практике в качестве такой строки для скриптов чаще всего берется MD5-хеш документа. Кроме того, в поле If-None-Match могут передаваться несколько меток, разделенных запятой.
Код для выполнения подобной проверки выглядит следующим образом (пояснение: глобальная переменная $GLOBALS['config']['nocache'] используется для отключения проверки кеша в отладочных целях, прочие параметры аналогичны описанным в предыдущем сообщении):
Далее…