Fast Site Engine

Высокопроизводительная CMS для сайтов.

Сделать сайт

Карта сайта
Переходим на Линукс
Политика конфиденциальности
Сделать сайт на основе Fast Site Engine

Установка
Документация
Список изменений
Лицензионное соглашение

Скачать
О движкеПроизводительностьБезопасностьТехнические требованияSEOКонтакты

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, T;//в более поздних
  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;

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



© Все права защищены 2004 - 2024