Почему иногда полный контент возвращается без изменений, если установлен параметр If-Modified-Since?

Мои сгенерированные php файлы миниатюр и комбинированные файлы javascript и css (все имеют свои даты истечения срока действия anc cache=public set etc) иногда возвращают полный контент, в других случаях они загружаются из прокси-кэша!

Это комментарий, который дает redbot.org, иногда:

Условный запрос If-Modified-Since вернул весь контент без изменений.

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


заголовок генератора миниатюр PHP

header ("Content-type: image/jpeg");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 404800000)." GMT");
header ("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
header ("Cache-Control: public, max-age=2419200");

Htaccess

<IfModule mod_headers.c>
ExpiresActive On
ExpiresDefault M172800

##### DEFAULT EXPIRES
<FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|xml|pdf|flv)$">
    ExpiresDefault M1209600
    Header set Cache-Control "max-age=1209600, public"
</FilesMatch>

##### DYNAMIC PAGES
<FilesMatch "\\.(php|cgi|pl)$">
    ExpiresDefault M7200
    Header set Cache-Control "public, max-age=7200"
</FilesMatch>

Header unset Pragma
Header unset ETag
Header unset Last-Modified
FileETag None
</IfModule>

Обновление: новая информация:

Google SpeedTest дает оценку 91/100 в верхней части, которую он говорит: и перечисляет все файлы, кроме сгенерированных php файлов, которые имеют явный набор заголовков expire ((которые все еще возвращают полный контент!??), он говорит:

В следующих ресурсах отсутствует валидатор кэша. Ресурсы, в которых не указан валидатор кэша, не могут быть эффективно обновлены. Укажите заголовок Last-Modified или ETag, чтобы включить проверку кэша для следующих ресурсов.

2 ответа

Можете ли вы использовать Firebug и вставить заголовки ответа HTTP. У меня есть ощущение, что, хотя в вашем коде вы устанавливаете управление кешем как Public, Apache переопределяет это, потому что для типа Php-файла вы устанавливаете Cache-Control как частное.

Одна вещь, которую вы можете сделать, это удалить настройки кеша для Dynamic Pages из конфигурации Apache. Это должно решить проблему, потому что Прокси не кэширует ответ без правильных заголовков.

РЕДАКТИРОВАТЬ

Привет Сэм, Возвращаясь к твоему вопросу, я нашел решение проблемы. Следующий фрагмент кода, кажется, проблема. В выходных данных вашего Php заголовок Last-Modified всегда изменяется, и когда браузер отправляет запрос 304 Если изменение, он видит изменение и, следовательно, повторно запрашивает этот контент.

header ("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 404800000)." GMT");

Удалите Last-Modified и ETags из вашего контента, чтобы ускорить работу сайта. Этот сайт также предоставляет несколько отличных советов.
http://www.askapache.com/htaccess/apache-speed-last-modified.html

Я добавил следующий код в свой файл htaccess, когда http://pagespeed.googlelabs.com/ в chrome. Я получил кеширование в браузере Leverage, которое теперь решено, но теперь оно выдает ошибку Указать валидатор кэша, как это сделать, у меня уже есть добавлены элементы управления кешем, ниже приведен код

<"ifModule mod_gzip.c>

  mod_gzip_on Yes

  mod_gzip_dechunk Yes

  mod_gzip_item_include file \\.(html?|txt|css|js|php|pl)$

  mod_gzip_item_include handler ^cgi-script$

  mod_gzip_item_include mime ^text/.*

  mod_gzip_item_include mime ^application/x-javascript.*

  mod_gzip_item_exclude mime ^image/.*

  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*

<"/ifModule>

<"ifModule mod_expires.c>

  ExpiresActive On

  ExpiresDefault "access plus 1 seconds"

  ExpiresByType text/html "access plus 1 seconds"

  ExpiresByType image/gif "access plus 2592000 seconds"

  ExpiresByType image/jpeg "access plus 2592000 seconds"

  ExpiresByType image/png "access plus 2592000 seconds"

  ExpiresByType text/css "access plus 604800 seconds"

  ExpiresByType application/x-javascript "access plus 216000 seconds"

<"/ifModule>

<"ifModule mod_headers.c>

  <"filesMatch "\\\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">

    Header set Cache-Control "max-age=2592000, public"

  <"/filesMatch>

  <"filesMatch "\\\\.(css)$">

    Header set Cache-Control "max-age=604800, public"
  <"/filesMatch>
  <"filesMatch "\\\\.(js)$">

    Header set Cache-Control "max-age=216000, private"

  <"/filesMatch>

  <"filesMatch "\\\\.(xml|txt)$">

    Header set Cache-Control "max-age=216000, public, must-revalidate"

  <"/filesMatch>

  <"filesMatch "\\\\.(html|htm|php)$">

    Header set Cache-Control "max-age=1, private, must-revalidate"

  <"/filesMatch>

<"/ifModule>

<"ifModule mod_headers.c>

  Header unset ETag

<"/ifModule>

FileETag None

<"ifModule mod_headers.c>

  Header unset Last-Modified

<"/ifModule>
Другие вопросы по тегам