Перейти к публикации

304 ответ, на запрос If-Modified-Since, для динамического контента сайта


Рекомендованные сообщения

Неделю назад я пробовал сделать правильный ответ 304, но не получилось. Пробовал самые разные костыли с интернета. При попытке изменить дату и проверить 304, получаю 200 даже если не было изменений, ну если просто проверить ответ сервера то любой новость выдавал 304 не смотря на обновленный контент.

Проще говоря у меня все получилось наоборот :( 

Еще в начале были проблемы с Last-Modified. Сервер не выдавал такую инфу, долго искал, наткнулся на форум 2017 года, там говорили про SSI в настройках WWW домена в ISP. Отключил эту функцию и все заработало, Last-Modified начал работать, но беда, голый Last-Modified никак не поможет...

Так что лучше обратитесь к разработчикам с ТЗ, в самом DLE нет такой функций. Если что я готов поддержать / разделить расходы если найдете исполнителя.

Изменено пользователем Хоббит
Ссылка на сообщение
Поделиться на других сайтах

Есть ли от этого смысл? Но как-то так, в корневой index.php (не через систему плагинов) после закомментированных строк */ ниже вставить:

/* ========= Last-Modified START ==================== */
header('Expires: '.gmdate('D, d M Y H:i:s', time() + 10800).' GMT');
header('Cache-Control: no-cache, must-revalidate');
$mt = filemtime($file_name);
$mt_str = gmdate("D, d M Y H:i:s ")."GMT";
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mt)
{header('HTTP/1.1 304 Not Modified');
die;
}
header('Last-Modified: '.$mt_str);
echo $text;
header("Vary: Accept-Encoding");
header("Accept-Encoding:gzip,deflate,sdch");
/* ========= Last-Modified END ====================== */

SSI в настройках домена - отключить

+ 10800 в первой строчке это Москва (+3 часа). Time zone list / Epoch to time zone converter

Проверка If-Modified-Since

MfK7VWFx.jpg

 

Или так:

$LastModified_unix = 1294844676; // время последнего изменения страницы
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); 
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}
header('Last-Modified: '. $LastModified);

 

Изменено пользователем Captain
Ссылка на сообщение
Поделиться на других сайтах
  17.11.2020 в 22:06, Captain сказал:

Есть ли от этого смысл? Но как-то так, в корневой index.php (не через систему плагинов) после закомментированных строк */ ниже вставить:


/* ========= Last-Modified START ==================== */
header('Expires: '.gmdate('D, d M Y H:i:s', time() + 10800).' GMT');
header('Cache-Control: no-cache, must-revalidate');
$mt = filemtime($file_name);
$mt_str = gmdate("D, d M Y H:i:s ")."GMT";
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mt)
{header('HTTP/1.1 304 Not Modified');
die;
}
header('Last-Modified: '.$mt_str);
echo $text;
header("Vary: Accept-Encoding");
header("Accept-Encoding:gzip,deflate,sdch");
/* ========= Last-Modified END ====================== */

SSI в настройках домена - отключить

+ 10800 в первой строчке это Москва (+3 часа). Time zone list / Epoch to time zone converter

Проверка If-Modified-Since

MfK7VWFx.jpg

 

Или так:


$LastModified_unix = 1294844676; // время последнего изменения страницы
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); 
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}
header('Last-Modified: '. $LastModified);

 

Расширить  

Теперь откройте webmaster.yandex.ru и проверьте ответ сервера изменив дату на любую другую кроме сегодняшнего дня. Получите 200 вместо 304.

По идее сайт должен отдавать 304 если новость не изменился, особенно актуально для поисковых ботов, поможет экономить караулинговый бюджет. 

Изменено пользователем Хоббит
Ссылка на сообщение
Поделиться на других сайтах

zGF2iajZ.jpg

 

$LastModified_unix = gmdate('D, d M Y H:i:s \G\M\T', time());
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); 
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}
header('Last-Modified: '. $LastModified);

 

Ссылка на сообщение
Поделиться на других сайтах
  17.11.2020 в 23:33, Captain сказал:

 

$LastModified_unix = gmdate('D, d M Y H:i:s \G\M\T', time());
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); 
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}
header('Last-Modified: '. $LastModified);

 

Расширить  

Кажется я не так выразился, прописал ваш код.

1. Дата новости: https://ibb.co/Sm2cKPw

2. Ответ сервера: https://ibb.co/Nm8dgqF

3. Изменяем дату при обращений: https://ibb.co/prctMwK

Первый ответ сервера без изменения даты обращения работает как надо (200). Второй ответ сервера неправильно (304) потому что бот обращался с датой 16 ноября 12:00, 2020 в то время новость изменил контент и имеет дату в первом скриншоте. Получается если бот индексировал ваш сайт 15 числа, то внесенные новые изменения не будут индексироваться т.к. сервер выдает 304 как будто Last-Modifed не изменился (а этот параметр есть, см. второй скрин)

Ссылка на сообщение
Поделиться на других сайтах
  22.11.2020 в 17:52, Zhur сказал:

@celsoft может рассмотрите внедрение в новые версии скрипта из коробки? Чтобы мы не мучились с костылями. 

Расширить  

Это вряд-ли, очень и очень маловероятно, мб через пару лет, или вообще 5-10 лет придётся ждать. 

Мне тоже интересен этот вопрос, если вдруг подумаете написать ТЗ и найти исполнителя, я мог бы разделить часть расхода на реализацию. 

Ссылка на сообщение
Поделиться на других сайтах
  22.11.2020 в 17:52, Zhur сказал:

может рассмотрите внедрение в новые версии скрипта из коробки? Чтобы мы не мучились с костылями. 

Расширить  

Нет, потому как это бессмысленная трата времени, и то что вы пытаетесь сделать также бессмысленно.

Делается это для снижения нагрузки. Что невозможно в данном случае. Чтобы отдать правильно, нужно почитать новость из БД, сравнить ее дату, и после этого отдавать тот или иной код. В данном случае проще и дешевле в плане нагрузки отдать сразу 200 код, и не "страдать" ерундой, не экономя по своей сути нечего.

Ссылка на сообщение
Поделиться на других сайтах
  22.11.2020 в 23:00, celsoft сказал:

Нет, потому как это бессмысленная трата времени, и то что вы пытаетесь сделать также бессмысленно.

Делается это для снижения нагрузки. Что невозможно в данном случае. Чтобы отдать правильно, нужно почитать новость из БД, сравнить ее дату, и после этого отдавать тот или иной код. В данном случае проще и дешевле в плане нагрузки отдать сразу 200 код, и не "страдать" ерундой, не экономя по своей сути нечего.

Расширить  

А что скажете про ETag? https://habr.com/ru/company/edison/blog/509484/

Ссылка на сообщение
Поделиться на других сайтах
  23.11.2020 в 10:03, Хоббит сказал:

А что скажете про ETag?

Расширить  

В настройках nginx например это включается и отключается. Это уже серверная настройка.

Ссылка на сообщение
Поделиться на других сайтах
  22.11.2020 в 23:00, celsoft сказал:

Нет, потому как это бессмысленная трата времени, и то что вы пытаетесь сделать также бессмысленно.

Расширить  

То есть сайты на 100 000 страниц которым нужно экономить краулинговый бюджет обреченны?

 

  22.11.2020 в 23:00, celsoft сказал:

Делается это для снижения нагрузки.

Расширить  

Речь шла не о нагрузке, а о том чтобы отдавать поисковому боту только нужные страницы, а не гонять по всем подряд. К тому же можно подумать о том чтобы реализовать включение и отключение функции по кнопке, кому не нужно - не используют, кому нужно - используют.

Ссылка на сообщение
Поделиться на других сайтах
  23.11.2020 в 16:29, Zhur сказал:

То есть сайты на 100 000 страниц которым нужно экономить краулинговый бюджет обреченны?

Расширить  

Вообще то он не экономится а наоборот повышается, и к эффективным методам относится запрет на индексацию ненужного а не 304 код ответа. Примерно следующее:

  Цитата

Найти страницы, на которых частотность кластера ключевых запросов стремится к 0. К примеру, такими страницами могут быть страницы фильтров. Следует закрыть найденные страницы от индексации;

Найти технические страницы сайта с кодом ответа сервера 200. Оптимизировать систему управления контентом сайта, чтобы такие страницы не создавались или были закрыты от индексации краулером поисковой системы;

Закрыть от индексации неактуальные и ненужные страницы. Например, страницы которые не несут смысловой нагрузки и/или по которым нет возврата на инвестиции.

Расширить  

 

Ссылка на сообщение
Поделиться на других сайтах

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

Короткий ответ: 
На текущий момент, правильная работа с протоколом клиентского кэширования версии HTTP/1.1 является промышленным стандартом, реализация которого обязана быть в любой системе где:

  1. нет обработки данных в реального времени
  2. взаимодействие клиента с сервером осуществляется на базе протокола HTTP до второй версии включительно

Необходимость в этом продиктована как в предельно высокой эффективности его работы при типичных сценариях эксплуатации проекта клиентом, так и в случаях оптимизаций базового уровня для эффективного взаимодействия с поисковыми системами. 

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

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

Длинный ответ

  Показать содержимое

 

Изменено пользователем demimurych
исправление опечаток и ошибок
Ссылка на сообщение
Поделиться на других сайтах

Реально многим ли нужно это?
От этого зависит реализация в том числе и сторонними разработчиками.

Ссылка на сообщение
Поделиться на других сайтах
  24.11.2020 в 21:51, Mr. Bot сказал:

Реально многим ли нужно это?
От этого зависит реализация в том числе и сторонними разработчиками.

Расширить  

Если сайт имеет меньше 1000 страниц, это вовсе не нужно (цитата с Google). 

Эффект заметен если страниц больше 100к. Да можно сторонними разработчиками, но много ли желающих и знающих как все это грамотно реализовать. 

Ссылка на сообщение
Поделиться на других сайтах
  25.11.2020 в 00:01, Хоббит сказал:

Если сайт имеет меньше 1000 страниц, это вовсе не нужно (цитата с Google). 

Эффект заметен если страниц больше 100к. Да можно сторонними разработчиками, но много ли желающих и знающих как все это грамотно реализовать. 

Расширить  

Собирайтесь, организовывайтесь, делайте ТЗ, пишите в личку)

Ссылка на сообщение
Поделиться на других сайтах
  24.11.2020 в 18:18, demimurych сказал:

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

Расширить  

Ну ну. Серверная же часть у них за счет воздуха работает, а для просчета используется Апач, ага ))) Пусть для начала просчитают и реализует корректное отслеживание всех возможных изменений на странице, публикаций, комментариев, доп. блоков. А потом говорят о технически безграмотных ответах.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...
  19.11.2020 в 18:33, Хоббит сказал:

$LastModified_unix = gmdate('D, d M Y H:i:s \G\M\T', time());

Расширить  

Тут не правильно! Нужно брать дату последнее редактирование поста из таблицы, а не текущее время.

Чисто для самого поста:
В файле engine/modules/functions.php

Найти:

if($_DOCUMENT_DATE) {
  @header ("Last-Modified: " . date('r', $_DOCUMENT_DATE) ." GMT");
}

Заменить на:

/**
 * Last-Modified or 304 Not Modified
 */
if ($_DOCUMENT_DATE) {

	$LastModified_unix = $_DOCUMENT_DATE; // время последнего изменения страницы
	$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
	$IfModifiedSince = false;

	if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
		$IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));

	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
		$IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));

	if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
		header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
		die();
	}

	header('Last-Modified: '. $LastModified);

} // End

Можете оформить в виде плагина сами, всё будет работать правильно. 

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...