Fast Site Engine
Высокопроизводительный движок для сайтов
Заказать сайт на основе движка
О движкеПроизводительностьБезопасностьТехнические требованияSEO 
Лицензионное соглашение
Демо
Установка
Панель управления
Модули
Документация
Шаблоны
Тесты производительности php
Планы на будущее
Список изменений
Отзывы и пожелания
Переходим на Линукс
Всякое разное
Всякое разное  »  if modified since

if modified since

Смысл if modified since заключается в том, что поисковик (в интернетах пишут что и браузеры сегодня такое умеют, не проверял) заходя на страницу считывают заголовок last modified (время последнего изменения документа). При следующем обращении поисковик посылает запомненную дату, задача сайта проверить не обновилась ли страница с предыдущего раза и в случае совпадения дат ответить заголовком 304 Not Modified и остановить выполнения скрипта. Данные заголовки увеличат скорость переиндексации сайта.

Как добавить заголовок if modified since

Если у вашего сайта ещё нет заголовка if modified since, внесите правку в файл:
/inc/_func.php найдите (~220+ строка)

} if(!getvars()){
  ...
}
Добавьте ниже чтоб получилось так:
} if(!getvars()){
  ...
}else{
  $a=array();
  if(isset($a[$g->item(0).$g->item(1).$g->item(2)])) $t=time();//TIME;//в более поздних
  else{
    $t=filemtime($g->file);
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$t){
      header('HTTP/1.1 304 Not Modified');
      die();
    }
  } header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T',$t));
}

Если на сайте есть динамические разделы: отзывы, каталог товаров итп. добавьте их названия в массив $a, взять можно из адресной строки браузера или в разделе панели управления править меню --> ссылка.

Примеры:

$a=array('reviews'=>1);
$a=array('reviews'=>1,'catalog'=>1);

Как проверить 304 not modified и if modified since

1) Проверить заголовки 304 not modified и if modified since можно при помощи сервиса проверка ответа сервера в яндекс вебмастере https://webmaster.yandex.ru/server-response.xml. Поставьте галочку "добавить заголовок If-Modified-Since" и поставьте там дату час тому назад должен выдать Код статуса https: "304 Not Modified". Далее установите дату на сутки назад - получим статус Код статуса https: "200 OK". Ура всё работает.
Само собой страница тестирования должна быть изменена перед проверкой.


2) Способ попроще https://last-modified.com/ru/if-modified-since.html. Вставляем адрес и вуаля, там всё по русски напишет чего найдено чего не найдено.

304 not modified не найден

Заголовок http if modified since будет найден в любом случае, а вот статус второго может оказаться таким: 304 not modified не найден, по 2-му способу проверки, по 1-му в яндексе он просто 200-й покажет.
Скорее всего проблема в том что через проксирующий сервер nginx 304 last modified не передаются заголовки или Apache не передаёт.

Я не наблюдаю такой проблемы сейчас, с Apache 2.2.27, но на всякий случай для связки Apache + php решается это двумя способами, если php установлен не как cgi:

.htaccess в самом низу приводим к виду:
1) Только в php
RewriteRule (.*) index.php?q=$1 [QSA,E=HTTP_IF_MODIFIED_SINCE:%{https:If-Modified-Since}]
2) На все фалы
RewriteRule (.*) index.php?q=$1 [QSA]
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{https:If-Modified-Since}]
#RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{https:If-None-Match}]

304 not modified nginx

Здесь немного сложнее, чтобы передавался заголовок back-end-у необходимо ему от этом сообщить. Если nginx работает как проксирующий сервер я бы сперва попробовал переключить на HTTP 1.1 - proxy_http_version 1.1; Nginx с Apache по умолчанию взаимодействуют по 1.0. Но к примеру на одном из моих серверов я так и не смог этого добиться за разумное время, в качестве проксирующего для отдачи статики стоял модуль к сипанели Nginx Admin (v4.8 Stable). Решил просто удалением модуля с front-end-ом.

location / {
  chunked_transfer_encoding off;
  proxy_http_version 1.1;
  proxy_pass        https://localhost:9001;
  proxy_buffering   off;
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  Host $host:9001;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header  Upgrade websocket; #?
}

Если же речь идёт об отдельном сервере под сайт, то конфигурации могут быть разными:

location ~ \.php$ {
  if_modified_since off; #На сайте nginx кто-то там писал что
  # для скриптов это и так отключено, данный флаг отключает внутреннюю проверку, пробуйте..
  fastcgi_pass  fcgi;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /путь/web$fastcgi_script_name;
  fastcgi_pass_header Last-Modified;
  include fastcgi_params;
}

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

proxy_set_header If-Modified-Since $http_if_modified_since;
proxy_pass_header If-Modified-Since;
fastcgi_param If-Modified-Since;
underscores_in_headers on;
ignore_invalid_headers off;

Если у кого есть работающие конфигурации пишите на почту выложу.

Страница сгенерирована за 0.002844 секунды
На один процесс веб-сервера: 352 стр/сек.
Всего Apache может отдать: 90 112 стр/сек.
Выделено php памяти: ~ 2MB

© Все права защищены 2004 - 2018
Карта сайта
Отслеживать изменения в Твиттере

Браузер построил за сек.
Полное время сек.

С момента выгрузки предыдущей страницы из памяти браузера: сек.