Перейти к содержимому


Выбрать шаблон и создать сайт

Просветите: last-modified и expires

#1 ShowPrint

ShowPrint
  • Пользователь PRO
  • 1 701 сообщений
  • Репутация: 405
0

Отправлено 23 Апрель 2015 - 01:21

Исходные данные: есть работающий сайт на HTML 4.01 Transitional, написанный на php, в котором написал следующий код для упомянутых meta-тегов:

$_PhpScriptName = substr( $_SERVER['SCRIPT_NAME'], strrpos( $_SERVER['SCRIPT_NAME'], "/" )+1, -4 );
$_LastModified = filemtime($_PhpScriptName.".php");
echo "<meta http-equiv='expires' content='".gmdate( 'D, d M Y H:i:s \G\M\T', $_LastModified )."'>
<meta http-equiv='last-modified' content='".gmdate( 'D, d M Y H:i:s \G\M\T', $_LastModified )."'>";

По моей задумке этот код определяет имя выполняющегося скрипта, определяет дату его закачки на сервер (по идее это дата последнего изменения) и проставляет эту дату в качестве значений для соответствующих meta. То есть реальная честная дата произведенных изменений. Все работает как часы.

 
Вопросов три:
1. Вставляю этот код в верстку новой версии сайта, который делаю на html5. Все отрабатывает также чётко, но!!! Валидатор грязно ругается:
Bad value last-modified for attribute http-equiv on element meta.
    <meta http-equiv='last-modified' content='Wed, 22 Apr 2015 21:04:37 GMT'>
Почему ругается - у меня нет никаких идей, никакая буковка и кавычка поменяться или потеряться не могла - банальный copy-paste... Ниччё не понимаю...  :angry:  У кого-нибудь есть предположения которые стоит проверить? 
 
2. Правильно ли я делаю что проставляю в эти 2 мета одинаковую дату? Ведь фразу Expires -Устанавливает дату и время, после которой информация в документе будет считаться устаревшей можно понимать двояко:
а) если бот скушал страничку до указанной даты, то для него готово новое блюдо и наступило время очередного пищеприема - тогда совпадение дат является верным (так думал все время)
б) сегодня пришла мысль что там может стоять  и предстоящая дата и сочетание этих тегов может восприниматься следующим образом: изменения скушал, теперь приходи тогда-то (например через неделю)
в) или все-таки Expires служит не для ботов, а для клиентских браузеров для управления кешированием?
Какую все-таки дату правильно проставлять в Expires?
 
3. Пытаясь разобраться в этом вопросе самостоятельно, анализируя некоторые "топовые" ресурсы, был несказанно удивлен по той причине что у половины изученных мною кодов эти теги вообще отсутствуют, а использование Expires вообще сводится к 1 из 10 ресурсов... Удивление было вызвано тем, что не помню в каком раздела, то точно помню что в Я-руководстве по созданию качественных сайтов был сделан отдельный акцент на наличие и правильность отдачи last-modified, на то что отдача заголовка быть обязательно настроена. При этом в Я-топе именно сайты которые не соответствуют этим рекомендациям. Так нужны ли эти теги вообще, тем более что после каждого внесения изменений я генерю реальный sitemap.xml который прописан и в Я и в Г. Может достаточно "одного из" вариантов?
Если относительно Expires  правильным является ответ 2-в, то нужен ли он вообще, если я задаю время кеширования в htaccess (полгода на картинки, неделю на JS и CSS и 3 дня на сам контент)?

 

 

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#2 Ixman

Ixman
  • Пользователь PRO
  • 2 159 сообщений
  • Репутация: 432

Отправлено 28 Апрель 2015 - 18:27

Как я понимаю он говорит, что такого значения для атрибута http-equiv нет, точнее его нет в новой версии html. Кстати я при миграции на html5 отказался от этих мета тегов. А вообще всё можно настроить через htaccess. используя mod_headers и прочие модули. Главное чтобы они были подключены на сервере.

 

​Сейчас поискал по закладкам у себя, материала соответствующего не нашёл, вот кусок настроек из htaccess файла одного из моих сайтов

############### Page Speed Ускорение сайта ###############
# кеширование в браузере на стороне пользователя
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access 7 days"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType text/css "access plus 1 year"
ExpiresByType text/html "access plus 7 day"
ExpiresByType text/x-javascript "access 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/x-icon "access 1 year"
ExpiresByType application/x-shockwave-flash "access 1 year"
</IfModule>
# Cache-Control
<ifModule mod_headers.c>
# 30 дней
<filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
# 30 дней
<filesMatch "\.(css|js)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
# 2 дня
<filesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=2592000, public, must-revalidate"
</filesMatch>
# 1 день
<filesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=2592000, private, must-revalidate"
</filesMatch>
</ifModule>
# Сжимаем компоненты сайта путем включения Gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$
</ifmodule>
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|xml|gz)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>
# Отключаем вывод заголовков Etag для следующих типов файлов
<ifModule mod_headers.c>
<filesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header unset ETag
FileETag None
</filesMatch>
</ifModule>
# Отключаем вывод заголовков Last-Modified для следующих типов файлов
<FilesMatch «\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css)$»>
Header unset Last-Modified
</FilesMatch>

Может наведёт на какие-нибудь мысли. Ну а для php файлов вполне нормально должна работать функция header();


  • 1

#3 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 1 701 сообщений
  • Репутация: 405

Отправлено 28 Апрель 2015 - 19:17

должна работать функция header()
 Если бы она еще сама знала, что она "должна"...  :D

Попробую еще побороться с ней пару ночей, ну а если "она меня" - придется заходить через htaccess... Как раз к тому времени у меня будет какая-никакая статистика по увеличению нагрузки на сервер и можно будет решить оставлять ли статику на апаче...

Спасибо пребольшучее за "кусок" - очень полезный, обязательно почитаю, уже некоторые новые моменты для себя увидел, даже без тщательного разбора, но и вопросы появились, например с какой целью отключается Etag и Last-Modified в конце "куска"? Ведь если я правильно понимаю в html5 они служат для одинаковых целей... По "человечьей" логике если нет данных о дате изменения файлов, то надо бы их перегрузить, чтоб они точно были актуальными,даже не смотря на то, что файлы кешированы... Можно конечно к этому вопросу подходить с другим рассуждением типа: если неизвестна дата изменения, то и грузить не стоит - но это как-то противоречит моему совковому воспитанию...

 

Хочется побороть все-таки header(), так как используя его можно проверить даты всех include-файлов и какой-бы кусок не поправил - отдавать действительно актуальную дату изменения...

 

Еще бы понять саму систему: если код динамически генерируется каждый раз при отдаче, то по идее last-modified должен соответствовать времени генерации страницы и Etag должен быть каждый раз новый, или Etag это прототип "контрольной суммы" и вне зависимости от времени генерации страницы он один и тот же всегда (при условии отсутствия изменений в содержимом) :unsure:

 

"Чем дальше в лес, тем третий лишний"... (с)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#4 Ixman

Ixman
  • Пользователь PRO
  • 2 159 сообщений
  • Репутация: 432

Отправлено 28 Апрель 2015 - 19:24

Вообще я отключил эти заголовки ради эксперимента, ибо натолкнулся на одну мысль

 

Механизм ETag (Entity Tag) предназначен для обнаружения новых версий запрошенных файлов. Когда сервер отсылает клиенту файл, он добавляет заголовок ETag, в который записывает хеш отправляемого файла.


Клиент же, при повторном запросе, добавляет заголовок If-None-Match, значение которого равно хешу файла в кеше. Если значение совпадают, то сервер возвращает ответ HTTP/1.1 304 Not Modified, а если не совпадают, тогда возвращает новую версию файла.

Таким образом, удаление заголовка ETag в ответах сервера отключает этот механизм. Что заставляет кеш клиента использовать только значения Expires и Cache-Control (если вы не используете Expires и Cache-Control не удаляйте ETag!). Выигрыш такого подхода в том, что между клиентом и сервером отпадает надобность обмениваться запросами проверки новых версий (If-None-Match и 304 Not Modified).

  • 0

#5 Rexxar

Rexxar
  • Пользователь
  • 590 сообщений
  • Репутация: 36

Отправлено 28 Апрель 2015 - 20:45

Валидатору не нравится само значение, но такая ситуация возможна при любом значение. Давно не видел, чтобы эту функцию использовали, просто забудьте ее.   

http://stackoverflow...meta-validation

 

Вот люди тут сказали, что поисковики и даже авторские мета уже не считывают, типа они устарели. Правильней конечно узнавать у представителей ПС. Я пару раз узнавал у платонов, почти все эти мета данные они не учитывают. Заголовок новости, описание и под вопросом ключи, но вот последняя модификация тоже может не учитываться. В любом случае в них нет необходимости, поэтому советую просто забыть про них. 


  • 0


#6 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 1 701 сообщений
  • Репутация: 405

Отправлено 28 Апрель 2015 - 22:16

@Rexxar, спасибо за ссылку и Ваше мнение... Видимо я уже безнадёжно устарел... :unsure:


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#7 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 1 701 сообщений
  • Репутация: 405

Отправлено 28 Апрель 2015 - 23:15

обмениваться запросами проверки новых версий

@Ixman, логика понятна, если не с чем сравнивать, то пропадает смысл сравнения и экономится время и ресурсы... Разумно с одной стороны, а если версия действительно новая? ждать окончания срока кеширования?

 

И еще вопрос: хочется разобраться, вот этим куском:

<filesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=2592000, private, must-revalidate"
</filesMatch>

Код "прочел", понял, кешируем на месяц, но при каждом обращении проверяем актуальность. хочется в голове понимания как определяется актуальность php-скрипта...

По сути ведь php генерит "виртуальную" страницу, которая нигде больше не существует кроме как в браузере юзверя или памяти сервера... В клиентском кеше хранится информация об имени скрипта и хеше гренерированного им кода? При обращении страница герерируется на сервере, сравниваются клиентский и серверный хеши и, в случае различий, страница сгенерённая на сервере грузится клиенту? Ведь страница сгенеренная php-скриптом заведомо более свежая, как только что рождённая, т.е. при отсутствии last-modified и сравнивать-то становится нечего? за исключением математических параметров (размера, хеш-кода). То есть если на моей странице имеет место "динамическая" картинка вставляемая из набора случайным образом, то и хеш всегда будет разным, а значит и кешировать нет смысла, потому как страница будет все равно грузиться почти каждый раз заново?

 

Ув. форумчане, прошу прощения за то что я такой "тупой, еще тупее", но хочется в голове разложить всё по полочкам, на свои места...


Сообщение отредактировал ShowPrint: 28 Апрель 2015 - 23:16

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#8 Ixman

Ixman
  • Пользователь PRO
  • 2 159 сообщений
  • Репутация: 432

Отправлено 29 Апрель 2015 - 12:41

Я не силён в глубинах алгоритмов и механизмов кеширования, но страницы генерируемые php скриптом отлично кешируются, иногда даже возникают проблемы. То есть инфа, выводимая скриптом, более новая просто не выводится, из-за того, что html снимок страницы находится в кеше. По сути в этом коде указан php для кеширования страниц с расширением php, ибо много не обновляемых страниц


  • 0

#9 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 1 701 сообщений
  • Репутация: 405

Отправлено 29 Апрель 2015 - 12:58

Спасибо @Ixman, глубинным дайвингом могу заняться и сам в свободное время, на данном этапе ограничусь информацией о том, что страницы кешируются. Пожалую настрою кеширование (в т.ч. Expires через htaccess) и воспользуюсь советом @Rexxar - вообще удалю эти теги...


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru