Внезапно озадачился вопросом, отдает ли мой сервер last-modified в HTTP-заголовках, и поддерживает ли if-modified-since. Оказалось, что не отдает и не поддерживает, и до хренища разных популярных серверов, судя по выдаче браузера и результатам этого сервиса, работают точно так же. Многие серверы вместо этого отдают expires со временем через секунду от запроса. А в сети опубликовано неимоверное количество статей с описанием того, как добавить last-modified через PHP.
Что за дичь? Почему вокруг столь простой и очевидной вещи, как время последнего изменения страницы, возникла чуть ли не теория заговора? Или это отголовски каких-то прошлых SEO-войн?
Как тогда поисковики обновляют свои индексы? Тупой периодической загрузкой полных страниц, плюс по результатам обновления sitemap?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Что за дичь? Почему вокруг столь простой и очевидной вещи, как время последнего изменения страницы, возникла чуть ли не теория заговора? Или это отголовски каких-то прошлых SEO-войн?
А вы представьте себе реализацию этого на уровне какой-нибудь CMS. Процесс формирования любой страницы — это обход дерева, начиная от листьев и до корня, и временем последней модификации в корне будет время листа/узла, который был изменён самым последним. Вы такой механизм хоть в одной CMS видели? Или в типичном веб-сервисе на asp.net?
Универсальную поддержку таких заголовков сделать невозможно. А самому делать никто не запрещает. Для статических ресурсов оно обычно работает нормально. Для динамических надо делать ручками.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Внезапно озадачился вопросом, отдает ли мой сервер last-modified в HTTP-заголовках, и поддерживает ли if-modified-since. Оказалось, что не отдает и не поддерживает, и до хренища разных популярных серверов, судя по выдаче браузера и результатам этого сервиса, работают точно так же. Многие серверы вместо этого отдают expires со временем через секунду от запроса.
У тебя, небось, страница собирается на стороне сервера из запчастей. Откуда бы Апачу знать про каждую из запчастей, когда она была в последний раз модифицированна?
EM>А в сети опубликовано неимоверное количество статей с описанием того, как добавить last-modified через PHP.
Ну да. Если страница генерируется PHP-ным скриптом, то ему, скрипту, казалось бы и знать, в какой момент она была последний раз модифицированна. А в статьях описывается, каким образом он эти знания может Апачу передать, чтобы они в HTTP-заголовок попали.
Здравствуйте, Слава, Вы писали:
С>А вы представьте себе реализацию этого на уровне какой-нибудь CMS. Процесс формирования любой страницы — это обход дерева, начиная от листьев и до корня, и временем последней модификации в корне будет время листа/узла, который был изменён самым последним.
И что в этом сложного? Каждый из источников-фрагментов, лежащих в хранилище, в любом случае имеет метку времени изменения. А если страница генерится вообще на лету, без привязки к хранимым данным, то можно и прямо в скрипте время указать, хоть текущее. Но его ж вообще нет в большинстве ответов.
Здравствуйте, Pzz, Вы писали:
Pzz>У тебя, небось, страница собирается на стороне сервера из запчастей. Откуда бы Апачу знать про каждую из запчастей, когда она была в последний раз модифицированна?
Дык, у меня их сам Апач и вставляет, через SSI/include. Неужто бы он надорвался заодно и время модификации вычислять?
Pzz>Если страница генерируется PHP-ным скриптом, то ему, скрипту, казалось бы и знать, в какой момент она была последний раз модифицированна.
Если скриптом, то понятно. Но Апач, как я понимаю, отдает время только для полностью статической страницы, в которой нет ни одного include. Это как-то слишком уж радикально.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>И что в этом сложного? Каждый из источников-фрагментов, лежащих в хранилище, в любом случае имеет метку времени изменения. А если страница генерится вообще на лету, без привязки к хранимым данным, то можно и прямо в скрипте время указать, хоть текущее. Но его ж вообще нет в большинстве ответов.
А то сложного, что немало говномоделей говноданных, не говоря уже о данных их внешних говносервисов, подобных меток времени не имеют, не предусмотрено архитектором (джуниором, то есть).
Здравствуйте, Слава, Вы писали:
С>А то сложного, что немало говномоделей говноданных, не говоря уже о данных их внешних говносервисов, подобных меток времени не имеют, не предусмотрено архитектором (джуниором, то есть).
То есть, Апач с его технологией SSI/include сюда тоже входит?
Здравствуйте, Евгений Музыченко, Вы писали:
С>>А то сложного, что немало говномоделей говноданных, не говоря уже о данных их внешних говносервисов, подобных меток времени не имеют, не предусмотрено архитектором (джуниором, то есть).
ЕМ>То есть, Апач с его технологией SSI/include сюда тоже входит?
Здравствуйте, vsb, Вы писали:
vsb>SSILastModified это не оно?
О, спасибо, оно! Делает то, что надо.
Я ж в первую очередь вбил гуглу запрос "apache last-modified", но на него высыпало кучу страниц с советами делать через PHP, поэтому даже мысли не возникло лезть напрямую в документацию. Хороший пример того, как мусор маскирует полезную информацию.
Здравствуйте, Евгений Музыченко, Вы писали:
С>>А вы представьте себе реализацию этого на уровне какой-нибудь CMS. Процесс формирования любой страницы — это обход дерева, начиная от листьев и до корня, и временем последней модификации в корне будет время листа/узла, который был изменён самым последним.
ЕМ>И что в этом сложного?
В программировании есть только две сложные вещи: инвалидация кэша и именование сущностей.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>То есть, Апач с его технологией SSI/include сюда тоже входит?
Если он сам все собирает и раздает, статику с SSI, то проблемы не будет — он может на дату изменения файлов смотреть. А вот когда ему отдают динамику без таких заголовков, он сам решить не может. В принципе он может посчитать хеш и отдать, например, ETag, но бекэнд все равно должен будет отработать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Если он сам все собирает и раздает, статику с SSI, то проблемы не будет — он может на дату изменения файлов смотреть.
По сути он так и делает — мне выше подсказали, что нужно включить SSILastModified. Удивительно, что в тех рекомендациях/обсуждениях, которые гугл находит первыми по целевому запросу, нет указаний на этот параметр.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Внезапно озадачился вопросом, отдает ли мой сервер last-modified в HTTP-заголовках, и поддерживает ли if-modified-since. Оказалось, что не отдает и не поддерживает, и до хренища разных популярных серверов, судя по выдаче браузера и результатам этого сервиса, работают точно так же. Многие серверы вместо этого отдают expires со временем через секунду от запроса. А в сети опубликовано неимоверное количество статей с описанием того, как добавить last-modified через PHP.
ЕМ>Что за дичь? Почему вокруг столь простой и очевидной вещи, как время последнего изменения страницы, возникла чуть ли не теория заговора? Или это отголовски каких-то прошлых SEO-войн?
ЕМ>Как тогда поисковики обновляют свои индексы? Тупой периодической загрузкой полных страниц, плюс по результатам обновления sitemap?
А есть ли польза от этого хедера? Мне кажется, сейчас, когда почти все страницы генерируются динамически, смысл в нем теряется, и поисковики это понимают. Есть ли исследования на эту тему?
Здравствуйте, Михaил, Вы писали:
М>сейчас, когда почти все страницы генерируются динамически, смысл в нем теряется
Смысл может теряться не от динамической генерации, как таковой, а от внесения уникального контента при каждой генерации. Когда страница в реальном времени отображает данные с других сервекров — понятное дело, нет смысла ее кэшировать на сколько-нибудь заметное время. А если страница просто собирается скриптом из фрагментов, расположенных в БД (в том числе обычных файлах), то у каждого такого фрагмента всегда есть временнАя метка. Пока еще не на каждой странице крутятся рекламные баннеры.
Здравствуйте, Михaил, Вы писали:
М>А есть ли польза от этого хедера? Мне кажется, сейчас, когда почти все страницы генерируются динамически, смысл в нем теряется, и поисковики это понимают. Есть ли исследования на эту тему?
Браузер включает этот заголовок, если страница у него в кеше. Т.е. во-первых сервер может экономить ресурсы на генерации страницы/чтении её с диска, во-вторых сервер может экономить ресурсы трафика, не передавая тело ответа, в-третьих клиент экономит трафик, в-четвёртых клиент быстрей получает ответ.
В идеале, конечно, лучше отдавать неизменяемый ресурс, чтобы браузер вообще запросов не делал, а всегда брал из кеша. Но не всегда это возможно.
Здравствуйте, Евгений Музыченко, Вы писали:
М>>сейчас, когда почти все страницы генерируются динамически, смысл в нем теряется
ЕМ>Смысл может теряться не от динамической генерации, как таковой, а от внесения уникального контента при каждой генерации. Когда страница в реальном времени отображает данные с других сервекров — понятное дело, нет смысла ее кэшировать на сколько-нибудь заметное время. А если страница просто собирается скриптом из фрагментов, расположенных в БД (в том числе обычных файлах), то у каждого такого фрагмента всегда есть временнАя метка. Пока еще не на каждой странице крутятся рекламные баннеры.
Но ориентируются-то на них. Какой смысл ориентироваться на стиль 90-х, если сейчас чуть более, чем каждый заказчик хочет динамику с выдачей всех этих "сейчас читают", модификацией под каждого пользователя отдельно и т.д.? Он и просто некэширование будет ставить, потому что URL одинаков, а пользователи разные.
Это, если что, не моя позиция, а рыночный запрос пользователей движков.
Вот когда начинается удар нагрузки — они могут часть выносить в статику.
Здравствуйте, netch80, Вы писали:
N>Но ориентируются-то на них. Какой смысл ориентироваться на стиль 90-х, если сейчас чуть более, чем каждый заказчик хочет динамику с выдачей всех этих "сейчас читают", модификацией под каждого пользователя отдельно и т.д.? Он и просто некэширование будет ставить, потому что URL одинаков, а пользователи разные. N>Это, если что, не моя позиция, а рыночный запрос пользователей движков.
N>Вот когда начинается удар нагрузки — они могут часть выносить в статику.
Когда начнётся удар нагрузки, будет использоваться eventual consistency. Т.е. никуда далее текущего нода запрос не выборку отправляется, просто суммируется с агрегатами от соседних нодов, актуальность которых — час или два назад.