Нужно ли снова отправлять ETag с заголовком 304 Not Modified?

Я играл с PHP, использовал ETags, IF_NONE_MATCH и т. Д., Когда произошла странная вещь. Я написал код ниже, который проверяет IF_NONE_MATCH. Если он соответствует моему ETag, я отправляю заголовок ответа 304. Если нет, я отправляю другим заголовкам указание браузеру кэшировать страницу и мой ETag вместе с ними. Я ожидал получить страницу один раз, а потом все время получать 304. Вместо этого я получаю страницу один раз, затем 304, затем страницу, затем 304 и т. Д. Когда я проверял представление заголовка Chrome, я увидел, что если я не установил ETag снова в коде 304, он не отправьте его обратно в заголовки запроса в следующий раз, когда я получу страницу. Это нормальное поведение или просто Chrome? Я делаю что-то неправильно?

Вот код:

<?php
    $etag = '89453fo245tyu5o423ty5349gu0p34';

    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
                                  $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
         header('', true, 304);
    } else {
         header('Expires: Fri, 06 Apr 2013 23:59:59 03:00 GMT');
         header('Pragma: cache');
         header('Cache-Control: public, must-revalidate, max-age=0');
         header('ETag: ' . $etag);
         echo 'new page';
    }

1 ответ

Решение

Я думаю, что проблема в вашем вызове заголовка. Используйте правильный заголовок вызова, как указано в этом ответе, и все должно быть хорошо:

header('HTTP/1.1 304 Not Modified');

Также помните, что если вы нажмете F5, чтобы обновить страницу, возможно, ваш браузер проигнорирует кеш и перейдет прямо к веб-серверу. Чтобы проверить, я бы добавил ссылку на ту же страницу или просто щелкнул в адресной строке браузера и нажал ввод.

Другие вопросы по тегам