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


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

Last-Modified


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

#41 FDA

FDA
  • Пользователь
  • 63 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:РФ

Опубликовано 15.09.2015 - 22:34

Функцией заголовка как можно догадаться из названия служит информирование клиента о дате последней модификации 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

К сожалению по данному решению у меня заголовки не отдаются.

Может что-то не правильно в изменениях файла /view/MainView.php.?



#42 FDA

FDA
  • Пользователь
  • 63 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:РФ

Опубликовано 03.10.2015 - 00:21

Помогите разобраться.

Заголовок LastModified с главной страницы отдается корректно, а других страниц - нет.
Время в базе изменяется везде корректно.

 

часть кода api/Pages.php^

/*
	*
	* Функция возвращает страницу по ее id или url (в зависимости от типа)
	* @param $id id или url страницы
	*
	*/
	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, date, 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();
	}
	
	/*
	*
	* Функция возвращает массив страниц, удовлетворяющих фильтру
	* @param $filter
	*
	*/
	public function get_pages($filter = array())
	{	
		$menu_filter = '';
		$visible_filter = '';
		$pages = array();

		if(isset($filter['menu_id']))
			$menu_filter = $this->db->placehold('AND menu_id in (?@)', (array)$filter['menu_id']);

		if(isset($filter['visible']))
			$visible_filter = $this->db->placehold('AND visible = ?', intval($filter['visible']));
		
		$query = "SELECT id, url, header, name, date, meta_title, meta_description, meta_keywords, body, menu_id, position, visible, last_update
		          FROM __pages WHERE 1 $menu_filter $visible_filter ORDER BY position";
	
		$this->db->query($query);
		
		foreach($this->db->results() as $page)
			$pages[$page->id] = $page;
			
		return $pages;
	}

	/*
	*
	* Создание страницы
	*
	*/	
	public function add_page($page)
	{	
	    if(!isset($page->last_update))
			$last_update_query = ', date=NOW()';
		$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_query WHERE id=?", $id);	
		return $id;
	}
	
	/*
	*
	* Обновить страницу
	*
	*/
	public function update_page($id, $page)
	{	
	    if(!isset($page->last_update))
			$last_update_query = ', date=NOW()';
		$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;
	}
	

Изменено: FDA, 03.10.2015 - 00:23


#43 Gragory

Gragory
  • Пользователь
  • 58 сообщений

Опубликовано 05.11.2015 - 02:36

DaVinci, подскажи решение для следующего: 

- При обновлении контента на главной странице, допустим, появляются новые товары (или же по ним просто обновляется информация), нужно чтобы обновлялся Last-Modified главной страницы.

- Соответсвенно тоже самое, но только со страницей блога.



#44 KostyanBr

KostyanBr
  • Пользователь
  • 75 сообщений
  • Заказчик, Пользователь

Опубликовано 10.03.2016 - 10:00

У кого то получилось сделать? В базе прописывается время хорошо, а на странице не выводится Last-Modified....



#45 therion

therion
  • Пользователь
  • 2 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 14.06.2016 - 21:07

Решение для обработки главной страницы. Можно так же сделать обновление тега при обновлении самих товаров (Активный, Рекомендуемый и тд)






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

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