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


Фото
* * * * - 7 голосов

Last-Modified


  • Чтобы отвечать, сперва войдите на форум
44 ответов в теме

#1 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 22.08.2014 - 11:41

Функцией заголовка как можно догадаться из названия служит информирование клиента о дате последней модификации web-документа.

 

------------------------------------------------------------------------------------------------------------

 

Как заголовок Last-Modified ускоряет поисковую индексацию?

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

Представьте. Есть сайт с 10 тысячами страниц. Сайт написан на php. Не отдается корректно заголок Last-Modified. Поисковой робот не может получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. Что он делает? Индексирует все страницы!!! А не только те, которые изменились.
Конечно! На многих сайтах используют Sitemap. Но Sitemap это рекомендация, помощь поисковому оптимизатору. Заменой заголовка Last-Modified он быть не может!

 

------------------------------------------------------------------------------------------------------------

 

http://habrahabr.ru/post/109043/

 

http://last-modified...-since-php.html

 

index.php

 







// Если все хорошо
if(($res = $view->fetch()) !== false)
{

	// Выводим результат
	header("Content-type: text/html; charset=UTF-8");

    $LastModified_unix = strtotime($view->last_update); // время последнего изменения страницы

    if(!empty($LastModified_unix) && $LastModified_unix > 0)
    {
        $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');
        }
        header('Last-Modified: '. $LastModified);
    }

	print $res;

 

/view/View.php

 







...
	public $currency;
	public $currencies;
	public $user;
	public $group;
	public $page;
	public $last_update;
...

		if(self::$view_instance)
		{
			$this->currency     = &self::$view_instance->currency;
			$this->currencies   = &self::$view_instance->currencies;
			$this->user         = &self::$view_instance->user;
			$this->group        = &self::$view_instance->group;
			$this->page         = &self::$view_instance->page;
			$this->last_update  = &self::$view_instance->last_update;
		}
...

 

для примера возьму class/Pages.php (в остальные классах - бренды, категории, товары по аналогии)

 







public function get_page($id)
	{
		if(gettype($id) == 'string')
			$where = $this->db->placehold(' WHERE url=? ', $id);
		else
			$where = $this->db->placehold(' WHERE id=? ', intval($id));

		$query = "SELECT id, url, header, name, meta_title, meta_description, meta_keywords, body, menu_id, position, visible, last_update
		          FROM __pages $where LIMIT 1";

		$this->db->query($query);
		return $this->db->result();
	}






public function add_page($page)
	{
		$query = $this->db->placehold('INSERT INTO __pages SET ?%', $page);
		if(!$this->db->query($query))
			return false;

		$id = $this->db->insert_id();
		$this->db->query("UPDATE __pages SET position=id, last_update=NOW() WHERE id=?", $id);
		return $id;
	}






public function update_page($id, $page)
	{
		$query = $this->db->placehold('UPDATE __pages SET ?% , last_update=NOW() WHERE id in (?@)', $page, (array)$id);
		if(!$this->db->query($query))
			return false;
		return $id;
	}

 

/view/MainView.php







if($this->page)
		{
			$this->design->assign('meta_title', $this->page->meta_title);
			$this->design->assign('meta_keywords', $this->page->meta_keywords);
			$this->design->assign('meta_description', $this->page->meta_description);

            if($this->page->last_update)
                $this->last_update = $this->page->last_update;
		}

 

 

SQL







ALTER TABLE `s_pages` ADD `last_update` TIMESTAMP NOT NULL AFTER `header`

 

проверяем http://last-modified...fied-since.html

 

d7bc9e1c02c7.jpg

 

===================================================

 

по вопросам: доработка, установки стучите в личку или скайп.

 

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

 

Смотрите другие доработки в моем профиле

 

скайп: simpladev


Изменено: DaVinci, 09.11.2015 - 00:53


#2 Vitalikxp

Vitalikxp
  • Пользователь
  • 30 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 22.08.2014 - 12:18

А можно поподробней что куда вставлять.. Заранее спасибо.



#3 osben

osben
  • Фрилансер
  • 774 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:UA, RU

Опубликовано 22.08.2014 - 17:05

буквально вчера думал о ETag
https://github.com/p...a/pull/86/files

 

 // Если все хорошо
 if(($res = $view->fetch()) !== false)
 {
-	// Выводим результат
-	header("Content-type: text/html; charset=UTF-8");	
-	print $res;
+	$ETag = md5($res); 
+	$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : false ;
+	
+	if ($if_none_match && $if_none_match == $ETag)
+	{ 
+	    header('HTTP/1.0 304 Not Modified'); 
+	    header('ETag: "'.$ETag.'"');
+	    print $res;
+	} 
+	else
+	{ 
+	    // Выводим результат
+	    header("Cache-Control: must-revalidate");  
+	    header("Content-type: text/html; charset=UTF-8");   
+	    header("ETag: $ETag");
+	    print $res;
+	
+	}

П.С. У вас вот такая проблема выйдет, товары на главной изменились, но page для главной не менялся, и тут выходит не корректно 304 отдавать ;)  и т.д.
Возможно я в своём варианте тоже что то не учел.  



#4 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 22.08.2014 - 18:05

Функцией заголовка как можно догадаться из названия служит информирование клиента о дате последней модификации web-документа.

Объясните, если кто знает, для чего нужно это информирование? Просто для сведения или еще какая польза есть или может быть?

Могу предположить, что при повторном запросе, например, главной страницы сайта http://site.ru/ браузер может сначала запросить заголовок, по заголовку определить время изменения, и если это время предшествует дате кеша страницы, то загрузить страницу из своего кеша, не запрашивая у сервера код страницы и тем самым сэкономив на трафике.

Но если так, то работать правильно не будет ни один из двух способов...

#5 osben

osben
  • Фрилансер
  • 774 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:UA, RU

Опубликовано 22.08.2014 - 18:40

ну во вервых, автор темы предложил код, который совсем не так будет (должен работать) так как контент динамический, а Last-Modified у него изменяется только тогда когда меняем page 

Мой вариант работает по хеш'у контента да со стороны сервера все ровно происходит те же запросы и т.д. как при 200 так и при 304, но для пользователя ето выглядит так http://c2n.me/iMwzKd 
То есть экономит трафик + грузит кеш.

На ету тему можно дискутировать, к тому же думаю некоторые браузеры могут ишачить



#6 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 22.08.2014 - 18:50

ну во вервых, автор темы предложил код, который совсем не так будет (должен работать) так как контент динамический, а Last-Modified у него изменяется только тогда когда меняем page 

Мой вариант работает по хеш'у контента да со стороны сервера все ровно происходит те же запросы и т.д. как при 200 так и при 304, но для пользователя ето выглядит так http://c2n.me/iMwzKd 
То есть экономит трафик + грузит кеш.

На ету тему можно дискутировать, к тому же думаю некоторые браузеры могут ишачить

 

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

 

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

 

osben, проверьте свою реализации сперва тут http://last-modified...fied-since.html и выложите скрин результата



#7 osben

osben
  • Фрилансер
  • 774 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:UA, RU

Опубликовано 22.08.2014 - 19:08

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

 

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

 

osben, проверьте свою реализации сперва тут http://last-modified...fied-since.html и выложите скрин результата


Чет Вы одну воду написали.... 

я предложил пример реализации, 
Это отлично, побольше людей таких было бы

которая работает именно так как надо
Возникает вопрос, а как надо ?

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

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

далеко не у всех она динамическая 
я предполагаю на основе своего опыта, логики симплы и сделанных проектов, доля не более 3% где статика. 
+ статическую страницу, page можно сделать и для категории для перекрытия (и т..д) что уже точно не как не может быть статически


Я выложил решение ETag а не Last-Modified

простите, уехал на уикенд, так что дискуссию вести не смогу
 



#8 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 22.08.2014 - 20:21


Я выложил решение ETag а не Last-Modified

простите, уехал на уикенд, так что дискуссию вести не смогу
 

 

для чего вы ее вообще начинали если тема называется Last-Modified



#9 osben

osben
  • Фрилансер
  • 774 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:UA, RU

Опубликовано 26.08.2014 - 09:42

манипуляция с Last-Modified сводится для того что бы отдать 304 ответ для клиента, правильно ?
Я показал вариант при котором можно тоже отдавать 304. И который по моему мнению более актуальнее работает на изменение контента. 

Если я не прав, то дайте пинок (конкретно ткните носом где я не прав что бы сделать выводы).

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

Или Вам не нравятся когда другие выкладывают свои идеи в Вашем теме ? Или что Вас подозревают что Вы что то не корректно написали, допустили ошибку (мое мнение с аргументами выше я приложил)? 
 



#10 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 12:00

все таки приложите по возможности скрин того что отдаст форма в ответ на ваше решение http://last-modified...fied-since.html

 

и как надо применять его если мы имеем рандомные выводы (товары, отзывы, статьи и т.п)?



#11 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 12:02



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

 

 

что конкретно работает не так как должно? я не понимаю) главная страница не обновляется автоматом? вы про это?



#12 Jabber

Jabber
  • Пользователь
  • 20 сообщений
  • Заказчик
  • Версия CMS:2.x
  • Откуда:Санкт-Петербург

Опубликовано 26.08.2014 - 14:25

А можно поподробней что куда вставлять.. Заранее спасибо.

DaVinci, присоединяюсь к просьбе - если можно, с подробностями, в какие файлы и в каком месте каждого файла вставлять. 



#13 Karen

Karen
  • Пользователь
  • 186 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x

Опубликовано 26.08.2014 - 15:30

А почему нельзя разобрать пошагово, то что пишут на http://habrahabr.ru/post/109043/? Я так понял там все правильно?

 

 

Настройка и обработка заголовока Last-Modified в php
Для того чтобы веб-сервер передавал php-backend'у заголовок If-Modified-Since необходимо ему от этом сообщить!

Для связки nginx + php так,
location ~ \.php$
{ 
  …
  if_modified_since off;
      
  fastcgi_pass  fcgi;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /<путь > /web$fastcgi_script_name;
  …
  fastcgi_pass_header Last-Modified;
  include fastcgi_params;
}

* This source code was highlighted with Source Code Highlighter.

Для связки apache + php, так
# If-Modified-Since (if php is not installed as cgi then comment lines below)
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

* This source code was highlighted with Source Code Highlighter.
Если php работает как модуль, то ничего настраивать не надо!

Простой php-код обработки запроса If-Modified-Since, 
$qtime = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])? $_SERVER['HTTP_IF_MODIFIED_SINCE']:'' ;

$modified = substr(gmdate('r', $timestamp), 0, -5).'GMT';

if ($hdr == $modified) 
{
header ("HTTP/1.1 304 Not Modified ");
header ("Last-Modified: $modified");
exit();
}
header ("Last-Modified: $modified");
//render

* This source code was highlighted with Source Code Highlighter.

Как обрабатывать запрос If-Modified-Since в symfony?
В symfony уже предусмотрен механизм обработки заголовка. Все что нужно разработчику, так это передать в объект sfWebResponse заголовок. В случае его указания фрейморк все сделает сам.
$datestamp = time();
$response->setHttpHeader('Last-Modified', $response->getDate($datestamp));

* This source code was highlighted with Source Code Highlighter.
Так как на странице как правило располагается разный контент, то я написал метод, который выставляет самый поздний из переданных заголовков!
static public function setLastModified($datestamp)
{
    $response = sfContext::getInstance()->getResponse();
    $request = sfContext::getInstance()->getRequest();

    if(is_array($datestamp))
    {
      rsort($datestamp, SORT_NUMERIC);
      $datestamp = $datestamp[0];
    }

    if(!$response->hasHttpHeader('Last-Modified'))
    {
      $response->setHttpHeader('Last-Modified', $response->getDate($datestamp));
    }
    else
    {
      $origLastModified = strtotime($response->getHttpHeader('Last-Modified'));
      if($origLastModified < $datestamp)
        $response->setHttpHeader('Last-Modified', $response->getDate($datestamp));
    }
}

* This source code was highlighted with Source Code Highlighter.
Его очень удобно использовать в случае, если на странице, например, располагается 3 последних видеролика, 3 последних статьи и там еще что-нибудь. Загружая каждую модель из базы данных, мы можем вызывать метод, и в итоге в ответе получив самую позднюю дату модификации.
Для интересующихся код обработки заголовка находится в классе sfCacheFilter.class.php.

В заключение хочу сказать, что использование заголовка Last-Modified не всегда оправдано. Например, если на сайте 5 тысяч страниц и на каждой находится один и тот же блок с часто меняющимся контентом, использовать заголовок будет бесполезно! В этом случае можно разве что отдавать разные заголовки для клиентов и поисковых роботов. Но как по мне обман роботов ни к чему хорошему не приводит. Ну или убрать этот блок ;).

Еще,

Проверить сайт на корректную обработку заголовка можно тут или так, 

<?php
$ch = curl_init();
  
  $url = 'http://site.ru/1.php ';
  
  curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'If-Modified-Since: Sun, 28 Nov 2010 15:45:53 GMT'
    ));
    
  ob_start();
  curl_exec ($ch);
  curl_close ($ch);
  $data = ob_get_contents();
  ob_end_clean();
  
  
  echo nl2br($data);
?>

* This source code was highlighted with Source Code Highlighter.
 


#14 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 26.08.2014 - 19:16

Разобрать можно. 

Во-первых, длинная цитата, если Вы ее хоть бегло прочли, относится к CMS symfony. Вот для начала и разберите указанную систему, а потом разберите пошагово свою цитату, выясните,  какой шаг имеет общий характер, а какой специфичен для той системы. Потом для специфичных шагов разработайте аналоги под Simpla. Когда все это проделаете, поделитесь впечатлениями и результатами.
 
Во-вторых, в цитированном фрагменте сказано: 

В заключение хочу сказать, что использование заголовка Last-Modified не всегда оправдано. Например, если на сайте 5 тысяч страниц и на каждой находится один и тот же блок с часто меняющимся контентом, использовать заголовок будет бесполезно! В этом случае можно разве что отдавать разные заголовки для клиентов и поисковых роботов. Но как по мне обман роботов ни к чему хорошему не приводит. Ну или убрать этот блок.

В Simpla, как во всяком магазине, есть корзина. Это важнейший из  динамический блоков.  Если для других блоков типа случайного вывода товаров, отзывов и проч. при выводе блока будет ошибка в том, что блок не всегда будет случайным, это совсем не критично и магазин это переживет. Но в случае корзины все будет иначе.
Допустим, мы применили метод от DaVinci, и посетитель, впервые придя на сайт, проводит следующие действия:
1. Открывает одну из инфо страниц.
2. Открывает страницу товара и кладет товар в корзину.
3. Открывает вторую инфо страницу.
4. Открывает вторую страницу товара и кладет второй товар в корзину.
5. Открывает опять первую инфо страницу.
6. Открывает опять вторую инфо страницу.

В корзине будет видно следующее:
4. Два товара
5. Корзина пуста
6. Один товар

Происходит это потому, что на шаге 5 инфо страница будет выдана из кеша, сделанного на шаге 1, когда корзина была пуста. Аналогичное безобразие будет и на шаге 6.
Таким образом, при простых переходах по разным страницам пользователь будет все время видеть РАЗНЫЕ корзины, в то время как он с корзиной никаких действий не производит! Что подумает простой пользователь об этом магазине и его владельце? Однозначно покупать в таком магазине рискнут не многие. Вот и думайте, какова ценность метода, предложенного DaVinci.
 
В-третьих, метод, который предложил osben, вроде бы не имеет таких недостатков, и должен работать корректно. Но у него есть другой недостаток. Он каждый раз на сервере заново формирует страницу полностью, и уже по полному коду страницы определяет, изменилась она или нет. Тем самым самая главная идея применения Last-Modified - экономия серверных ресурсов - фактически и не работает. Экономится только на передаче от сервера  браузеру, что при современном развитии интернет-коммуникаций куда менее принципиально.



#15 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 19:24

Разобрать можно. 

Во-первых, длинная цитата, если Вы ее хоть бегло прочли, относится к CMS symfony. Вот для начала и разберите указанную систему, а потом разберите пошагово свою цитату, выясните,  какой шаг имеет общий характер, а какой специфичен для той системы. Потом для специфичных шагов разработайте аналоги под Simpla. Когда все это проделаете, поделитесь впечатлениями и результатами.
 
Во-вторых, в цитированном фрагменте сказано: 

В заключение хочу сказать, что использование заголовка Last-Modified не всегда оправдано. Например, если на сайте 5 тысяч страниц и на каждой находится один и тот же блок с часто меняющимся контентом, использовать заголовок будет бесполезно! В этом случае можно разве что отдавать разные заголовки для клиентов и поисковых роботов. Но как по мне обман роботов ни к чему хорошему не приводит. Ну или убрать этот блок.

В Simpla, как во всяком магазине, есть корзина. Это важнейший из  динамический блоков.  Если для других блоков типа случайного вывода товаров, отзывов и проч. при выводе блока будет ошибка в том, что блок не всегда будет случайным, это совсем не критично и магазин это переживет. Но в случае корзины все будет иначе.
Допустим, мы применили метод от DaVinci, и посетитель, впервые придя на сайт, проводит следующие действия:
1. Открывает одну из инфо страниц.
2. Открывает страницу товара и кладет товар в корзину.
3. Открывает вторую инфо страницу.
4. Открывает вторую страницу товара и кладет второй товар в корзину.
5. Открывает опять первую инфо страницу.
6. Открывает опять вторую инфо страницу.

В корзине будет видно следующее:
4. Два товара
5. Корзина пуста
6. Один товар

Происходит это потому, что на шаге 5 инфо страница будет выдана из кеша, сделанного на шаге 1, когда корзина была пуста. Аналогичное безобразие будет и на шаге 6.
Таким образом, при простых переходах по разным страницам пользователь будет все время видеть РАЗНЫЕ корзины, в то время как он с корзиной никаких действий не производит! Что подумает простой пользователь об этом магазине и его владельце? Однозначно покупать в таком магазине рискнут не многие. Вот и думайте, какова ценность метода, предложенного DaVinci.
 
В-третьих, метод, который предложил osben, вроде бы не имеет таких недостатков, и должен работать корректно. Но у него есть другой недостаток. Он каждый раз на сервере заново формирует страницу полностью, и уже по полному коду страницы определяет, изменилась она или нет. Тем самым самая главная идея применения Last-Modified - экономия серверных ресурсов - фактически и не работает. Экономится только на передаче от сервера  браузеру, что при современном развитии интернет-коммуникаций куда менее принципиально.

 

не обязательно в корзине отдавать Last-Modified (тем более ее не надо индексировать да и не индексируется она) и проблем в этом случае нет (проверенно)... помимо корзины есть разделы order, user в которых так же не надо проводить ни каких манипуляций.

 

robots.txt

User-agent: *

Disallow: /sections/404

Disallow: /simpla/
Disallow: /order/
Disallow: /user/
Disallow: /js/
Disallow: /captcha/
Disallow: /Smarty/
Disallow: /design/
Disallow: /api/
Disallow: /compiled/
Disallow: /cart/
Disallow: /resize/
Disallow: /password.php

метод который предложил osben, помимо тех недостатков которые вы упомянули, в случае с рандомным контентом будет работать корректно только в том случае если весь рандомный контент подтягивать через ajax



#16 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 26.08.2014 - 19:43

а прям обязательно в корзине отдавать Last-Modified (тем более ее не надо индексировать да и не индексируется она)? я думаю нет, и проблем в этом случае тоже нет (проверенно)...

Возможно, я сказал недостаточно четко о том, что речь идет не об отдельной странице корзины (тут, как Вы справедливо заметили, все корректно, если для этой страницы не отдавать Last-Modified), а об информере - блоке корзины, который формируется в основном шаблоне и, следовательно, показывается на ВСЕХ страницах. И в этом блоке описанная проблема встает во всей своей красе.

#17 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 19:52

Возможно, я сказал недостаточно четко о том, что речь идет не об отдельной странице корзины (тут, как Вы справедливо заметили, все корректно, если для этой страницы не отдавать Last-Modified), а об информере - блоке корзины, который формируется в основном шаблоне и, следовательно, показывается на ВСЕХ страницах. И в этом блоке описанная проблема встает во всей своей красе.

 

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



#18 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 20:20

проверил - вариант с принудительным обновление корзины через ajax работает. отправляем пустой запрос в /ajax/cart.php, обновляем informer



#19 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 26.08.2014 - 20:48

Сомневаюсь, что это решит вопрос полностью.
Это ж надо всю систему перекопать и так все подобные моменты заново переделать.
А с некоторыми к тому же совсем не очевидно сразу, как решать. Например, подобный вопрос возникнет в связи с тем, что пользователь может переключать отображение цен на разные валюты.
Когда придумаете способ справиться с этим, скорее всего, возникнет еще что-то.
Стоит ли овчинка выделки?

#20 DaVinci

DaVinci
  • Фрилансер
  • 672 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 26.08.2014 - 21:42

упустил момент - тестил корзину с установленным примером от osben-a. 

 

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






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых