Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


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

Надіслати
Поділитися на інших сайтах


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

 

<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: ...

Надіслати
Поділитися на інших сайтах


  • 3 weeks later...

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

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.