Jump to content
Sign in to follow this  
rezhisser

Формируются некорректные ссылки

Recommended Posts

Добрый день!

 

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

 

В поисковиках про индексировались странные, как по мне, бессмысленные ссылки, например:

http://zapisky.com.ua/bloknoty/index.php?route=information/contact
http://zapisky.com.ua/zakladki/index.php?route=information/contact
http://zapisky.com.ua/dizainerskie-tetradi/index.php?route=information/contact
http://zapisky.com.ua/sketchbuki/index.php?route=information/contact
http://zapisky.com.ua/zapisnye-knizhki/index.php?route=information/contact
http://zapisky.com.ua/artbuki/index.php?route=information/contact
http://zapisky.com.ua/search/index.php?route=information/contact
http://zapisky.com.ua/tetradi/index.php?route=information/contact
http://zapisky.com.ua/oblozhki/oblozhki-dlya-dokumentov/index.php?route=information/contact
http://zapisky.com.ua/derzhateli-dlya-knig/index.php?route=information/contact
http://zapisky.com.ua/podarochnye-nabory/index.php?route=information/contact
http://zapisky.com.ua/knigi/elitnye-knigi/index.php?route=information/contact
http://zapisky.com.ua/ruchki/sharikovye-ruchki/index.php?route=information/contact
http://zapisky.com.ua/ezhednevniki/index.php?route=information/contact
http://zapisky.com.ua/oblozhki/oblozhki-dlya-pasporta/index.php?route=information/contact
http://zapisky.com.ua/koshelki/index.php?route=information/contact
http://zapisky.com.ua/organajzery/index.php?route=information/contact
http://zapisky.com.ua/ruchki/aksessuary-dlia-ruchek/index.php?route=information/contact
http://zapisky.com.ua/chehly-bloknoty-dlya-ipad/index.php?route=information/contact
http://zapisky.com.ua/ezhednevniki/egednevniki-blankster/index.php?route=information/contact

 

Не могу понять, откуда они берутся.

 

И вроде бы постепенно появляются новые...

 

Установлен seopro, все вроде бы норм с ним

Share this post


Link to post
Share on other sites

Так у Вас в меню ссылки на статьи такого вида

 

<a href="index.php?route=information/information&information_id=3" title="Каталог" class="top-lvl custom-link">Каталог</a>
Поправьте в header.tpl Edited by cloudrc

Share this post


Link to post
Share on other sites

Так у Вас в меню ссылки на статьи такого вида

 

<a href="index.php?route=information/information&information_id=3" title="Каталог" class="top-lvl custom-link">Каталог</a>
Поправьте в header.tpl

 

 

не думаю, что это связано как-то...

 

 

У меня есть ссылка на категорию 

http://zapisky.com.ua/podarochnye-nabory

А где-то еще формируется ссылка 

http://zapisky.com.ua/podarochnye-nabory/index.php?route=information/contact

в которой половина ссылки правильная, а вторая половина - это часть ссылки на страницу Контакты

http://zapisky.com.ua/index.php?route=information/contact
Edited by rezhisser

Share this post


Link to post
Share on other sites

смотреть

какие правила в .htaccess

что в контроллере используемого seo (если seo-pro - это файл catalog\controller\common\seo_pro.php)

что фактически в таблице url_alias для проблемных ссылок указано

Share this post


Link to post
Share on other sites

смотреть

какие правила в .htaccess

что в контроллере используемого seo (если seo-pro - это файл catalog\controller\common\seo_pro.php)

что фактически в таблице url_alias для проблемных ссылок указано

 

1. В .htaccess правил, которые могли бы как-то повлиять не нашел

 

2. Контроллер прилагаю тоже, в нем самостоятельно не разберусь...

 

<?php
class ControllerCommonSeoPro extends Controller {
	private $cache_data = null;

	public function __construct($registry) {
		parent::__construct($registry);
		$this->cache_data = $this->cache->get('seo_pro');
		if (!$this->cache_data) {
			$query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias");
			$this->cache_data = array();
			foreach ($query->rows as $row) {
				$this->cache_data['keywords'][$row['keyword']] = $row['query'];
				$this->cache_data['queries'][$row['query']] = $row['keyword'];
			}
			$this->cache->set('seo_pro', $this->cache_data);
		}
	}

	public function index() {

		// Add rewrite to url class
		if ($this->config->get('config_seo_url')) {
			$this->url->addRewrite($this);
		} else {
			return;
		}

		// Decode URL
		if (!isset($this->request->get['_route_'])) {
			$this->validate();
		} else {
			$route_ = $route = $this->request->get['_route_'];
			unset($this->request->get['_route_']);
			$parts = explode('/', trim(utf8_strtolower($route), '/'));
			list($last_part) = explode('.', array_pop($parts));
			array_push($parts, $last_part);

			$rows = array();
			foreach ($parts as $keyword) {
				if (isset($this->cache_data['keywords'][$keyword])) {
					$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
				}
			}

			if (count($rows) == sizeof($parts)) {
				$queries = array();
				foreach ($rows as $row) {
					$queries[utf8_strtolower($row['keyword'])] = $row['query'];
				}

				reset($parts);
				foreach ($parts as $part) {
					$url = explode('=', $queries[$part], 2);

					if ($url[0] == 'category_id') {
						if (!isset($this->request->get['path'])) {
							$this->request->get['path'] = $url[1];
						} else {
							$this->request->get['path'] .= '_' . $url[1];
						}
					} elseif (count($url) > 1) {
						$this->request->get[$url[0]] = $url[1];
					}
				}
			} else {
				$this->request->get['route'] = 'error/not_found';
			}

			if (isset($this->request->get['product_id'])) {
				$this->request->get['route'] = 'product/product';
				if (!isset($this->request->get['path'])) {
					$path = $this->getPathByProduct($this->request->get['product_id']);
					if ($path) $this->request->get['path'] = $path;
				}
			} elseif (isset($this->request->get['path'])) {
				$this->request->get['route'] = 'product/category';
			} elseif (isset($this->request->get['manufacturer_id'])) {
				$this->request->get['route'] = 'product/manufacturer/info';
			} elseif (isset($this->request->get['information_id'])) {
				$this->request->get['route'] = 'information/information';
			} elseif(isset($this->cache_data['queries'][$route_])) {
					header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
					$this->response->redirect($this->cache_data['queries'][$route_]);
			} else {
				if (isset($queries[$parts[0]])) {
					$this->request->get['route'] = $queries[$parts[0]];
				}
			}


			$this->validate();

			if (isset($this->request->get['route'])) {
				return $this->forward($this->request->get['route']);
			}
		}
	}

	public function rewrite($link) {
		if (!$this->config->get('config_seo_url')) return $link;

		$seo_url = '';

		$component = parse_url(str_replace('&', '&', $link));

		$data = array();
		parse_str($component['query'], $data);

		$route = $data['route'];
		unset($data['route']);

		switch ($route) {
			case 'product/product':
				if (isset($data['product_id'])) {
					$tmp = $data;
					$data = array();
					if ($this->config->get('config_seo_url_include_path')) {
						$data['path'] = $this->getPathByProduct($tmp['product_id']);
						if (!$data['path']) return $link;
					}
					$data['product_id'] = $tmp['product_id'];
					if (isset($tmp['tracking'])) {
						$data['tracking'] = $tmp['tracking'];
					}
				}
				break;

			case 'product/category':
				if (isset($data['path'])) {
					$category = explode('_', $data['path']);
					$category = end($category);
					$data['path'] = $this->getPathByCategory($category);
					if (!$data['path']) return $link;
				}
				break;

			case 'product/product/review':
			case 'information/information/info':
			case 'product/quickview':
				return $link;
				break;

			default:
				break;
		}

		if ($component['scheme'] == 'https') {
			$link = $this->config->get('config_ssl');
		} else {
			$link = $this->config->get('config_url');
		}

		$link .= 'index.php?route=' . $route;

		if (count($data)) {
			$link .= '&' . urldecode(http_build_query($data, '', '&'));
		}

		$queries = array();
		foreach ($data as $key => $value) {
			switch ($key) {
				case 'product_id':
				case 'manufacturer_id':
				case 'category_id':
				case 'information_id':
					$queries[] = $key . '=' . $value;
					unset($data[$key]);
					$postfix = 1;
					break;

				case 'path':
					$categories = explode('_', $value);
					foreach ($categories as $category) {
						$queries[] = 'category_id=' . $category;
					}
					unset($data[$key]);
					break;

				default:
					break;
			}
		}

		if(empty($queries)) {
			$queries[] = $route;
		}

		$rows = array();
		foreach($queries as $query) {
			if(isset($this->cache_data['queries'][$query])) {
				$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);
			}
		}

		if(count($rows) == count($queries)) {
			$aliases = array();
			foreach($rows as $row) {
				$aliases[$row['query']] = $row['keyword'];
			}
			foreach($queries as $query) {
				$seo_url .= '/' . rawurlencode($aliases[$query]);
			}
		}

		if ($seo_url == '') return $link;

		$seo_url = trim($seo_url, '/');

		if ($component['scheme'] == 'https') {
			$seo_url = $this->config->get('config_ssl') . $seo_url;
		} else {
			$seo_url = $this->config->get('config_url') . $seo_url;
		}

		if (isset($postfix)) {
			$seo_url .= trim($this->config->get('config_seo_url_postfix'));
		} else {
			$seo_url .= '/';
		}

		if(substr($seo_url, -2) == '//') {
			$seo_url = substr($seo_url, 0, -1);
		}

		if (count($data)) {
			$seo_url .= '?' . urldecode(http_build_query($data, '', '&'));
		}

		return $seo_url;
	}

	private function getPathByProduct($product_id) {
		$product_id = (int)$product_id;
		if ($product_id < 1) return false;

		static $path = null;
		if (!is_array($path)) {
			$path = $this->cache->get('product.seopath');
			if (!is_array($path)) $path = array();
		}

		if (!isset($path[$product_id])) {
			$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1");

			$path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0);

			$this->cache->set('product.seopath', $path);
		}

		return $path[$product_id];
	}

	private function getPathByCategory($category_id) {
		$category_id = (int)$category_id;
		if ($category_id < 1) return false;

		static $path = null;
		if (!is_array($path)) {
			$path = $this->cache->get('category.seopath');
			if (!is_array($path)) $path = array();
		}

		if (!isset($path[$category_id])) {
			$max_level = 10;

			$sql = "SELECT CONCAT_WS('_'";
			for ($i = $max_level-1; $i >= 0; --$i) {
				$sql .= ",t$i.category_id";
			}
			$sql .= ") AS path FROM " . DB_PREFIX . "category t0";
			for ($i = 1; $i < $max_level; ++$i) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";
			}
			$sql .= " WHERE t0.category_id = '" . $category_id . "'";

			$query = $this->db->query($sql);

			$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

			$this->cache->set('category.seopath', $path);
		}

		return $path[$category_id];
	}

	private function validate() {
		if (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') {
			return;
		}
		if (isset($this->request->get['route']) && $this->request->get['route'] == 'product/quickview') {
			return;
		}
		if(empty($this->request->get['route'])) {
			$this->request->get['route'] = 'common/home';
		}

		if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
			return;
		}

		if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
			$config_ssl = substr($this->config->get('config_ssl'), 0, $this->strpos_offset('/', $this->config->get('config_ssl'), 3) + 1);
			$url = str_replace('&', '&', $config_ssl . ltrim($this->request->server['REQUEST_URI'], '/'));
			$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));
		} else {
			$config_url = substr($this->config->get('config_url'), 0, $this->strpos_offset('/', $this->config->get('config_url'), 3) + 1);
			$url = str_replace('&', '&', $config_url . ltrim($this->request->server['REQUEST_URI'], '/'));
			$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));
		}

		if (rawurldecode($url) != rawurldecode($seo)) {
			header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

			$this->response->redirect($seo);
		}
	}

	private function strpos_offset($needle, $haystack, $occurrence) {
		// explode the haystack
		$arr = explode($needle, $haystack);
		// check the needle is not out of bounds
		switch($occurrence) {
			case $occurrence == 0:
				return false;
			case $occurrence > max(array_keys($arr)):
				return false;
			default:
				return strlen(implode($needle, array_slice($arr, 0, $occurrence)));
		}
	}

	private function getQueryString($exclude = array()) {
		if (!is_array($exclude)) {
			$exclude = array();
			}

		return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));
		}
	}
?>

 

3. В таблице url_alias все норм. 

На примере указанной ссылки

 

url_alias_id       query                            keyword
7805                 category_id=93            podarochnye-nabory

 

 

Упоминаний information/contact три, что соответствует  количеству ссылок на страницу Контакты

 

Откуда поисковики взяли ссылку 

http://zapisky.com.ua/podarochnye-nabory/index.php?route=information/contact

непонятно

Share this post


Link to post
Share on other sites

не думаю, что это связано как-то...

Прошу прощения, не полностью рассмотрел ссылки)

Но ни в Яндексе, ни в Google не смог найти подобных ссылок на Ваш сайт

Share this post


Link to post
Share on other sites

Прошу прощения, не полностью рассмотрел ссылки)

Но ни в Яндексе, ни в Google не смог найти подобных ссылок на Ваш сайт

 

Эти ссылки из гугл веб мастер в ошибках сканирования, ни них 404. Да, я тоже их не вижу через site: ...

Share this post


Link to post
Share on other sites

Просмотрел одну из страниц. У вас всего 2 ссылки <a href="index.php?route=information/contact"....></a>. То есть, 1 из них дописывает текущий url страницы. Попробуйте прогнать netpeak spider (бесплатная программа). Если ошибка будет замечена и там - исправляйте <a href="index.php?route=information/contact"....></a> на <a href="/index.php?route=information/contact"....></a> (слэш перед началом ссылки). Жетско покажите привязанность к главной странице. Потом перепроверьте - должно все нормально стать - не раз сталкивался с проблемой такой генерации 404 ошибок.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.