Перейти к содержанию
rezhisser

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

Рекомендуемые сообщения

Добрый день!

 

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

 

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

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, все вроде бы норм с ним

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

<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
Изменено пользователем rezhisser

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотреть

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотреть

какие правила в .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

непонятно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просмотрел одну из страниц. У вас всего 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 ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.