Назад | Перейти на главную страницу

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

мои файлы миниатюр, сгенерированные php, и комбинированные файлы javascript и css (у всех есть даты истечения срока действия и кеш = общедоступный набор и т. д.) иногда возвращают полный контент, в других случаях они загружаются из кеша прокси!

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

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

* HTTP позволяет клиентам делать условные запросы, чтобы узнать, действительна ли хранимая у них копия. Поскольку этот ответ имеет заголовок Last-Modified, клиенты должны иметь возможность использовать заголовок запроса If-Modified-Since для проверки. КРАСНЫЙ сделал это и обнаружил, что ресурс отправляет полный ответ, даже если он не изменился, указывая, что он не поддерживает проверку Last-Modified. **


заголовок генератора миниатюр 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 которые имеют явный набор заголовков истечения срока действия ((который все еще возвращает полный контент! ??), он говорит:

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

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

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

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

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

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>