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

[Доработка] Борьба с 404 ошибкой, вернее ее отсутствием, удаление дубликатов ссылок

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

Приветствую! Возникла необходимость вывода 404 ошибки при неверном запросе. Для СЕО режима решается все просто и варианты здесь предлагались. Без СЕО я варианта не нашел.

Решение, кхм.. не самое красивое, но вроде работает.

1. В файле system/library/response меняем спецификатор доступа private у свойства $headers на public, т.е строка 3 будет выглядеть:

public $headers = array();
Делать это приходится, увы, чтобы иметь возможность добавить в каждом из контроллеров (продукт, категория, производитель) вывода хедера с 404 ответом, иначе он у меня добавляется уже после хедера с кодировкой.

2. В файлах category.php, manufacturer.php, product.php каталога catalog/controller/product перед строкой (2 - ой в скрипте, внутри else {})

$this->response->setOutput($this->render(TRUE), $this->config->get('config_compression'));
надо добавить

array_unshift($this->response->headers, $this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');

В итоге 404 ошибка будет выдаваться и при неверных ID товара, категории, производителя.

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

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


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

была где то темка посвященная ошибке 404, но суть решения было примерно таким же)

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


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

была где то темка посвященная ошибке 404, но суть решения было примерно таким же)

Понятно, ну если лучшего решения нет, будем юзать что есть)

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

Файл catalog/controller/common/seo_url.php

Добавить после

if (isset($this->request->get['route'])) {

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

		}
(примерно 55 строка)

else if(isset($this->request->get["route"]))
		{
			if 	($this->request->get["route"] == 'product/category' ||
				 $this->request->get["route"] == 'product/product' ||
				 $this->request->get["route"] == 'information/information' ||
				 $this->request->get["route"] == 'product/manufacturer')
			{
				
				$query = $this->db->query("SELECT value FROM " . DB_PREFIX . "setting WHERE `key` = 'config_seo_url'");

				if ($query->row["value"] == 1)
				{
					$is_seo = true;

					if ($this->request->get["route"] == "product/category")
					{
						if (isset($this->request->get["path"]))
						{
							$path = explode("_", $this->request->get["path"]);

							foreach ($path as $cat_id)
							{
								$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'category_id=" . $this->db->escape($cat_id) . "'");

								if (!$query->num_rows) $is_seo = false;
							}
						}
					}
					else if ($this->request->get["route"] == "product/product")
					{
						if (isset($this->request->get["path"])) $is_seo = false;

						else if (isset($this->request->get["product_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'product_id=" . $this->db->escape($this->request->get["product_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}
					}
					else if ($this->request->get["route"] == "information/information")
					{
						if (isset($this->request->get["information_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'information_id=" . $this->db->escape($this->request->get["information_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}

					}
					else if ($this->request->get["route"] == "product/manufacturer")
					{
						if (isset($this->request->get["manufacturer_id"]))
						{
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE query = 'manufacturer_id=" . $this->db->escape($this->request->get["manufacturer_id"]) . "'");
							if (!$query->num_rows) $is_seo = false;
						}
					}
				}

				if ($is_seo == true)
				{
					$this->request->get['route'] = "error/not_found";
					return $this->forward($this->request->get['route']);
				}

			}
		}

Этот код, как я надеюсь) проверяет все не СЕО ссылки на их СЕО аналоги, при включенном СЕО режиме. В случае нахождения аналога выводится 404 ошибка. На первый взгляд работает, но очень тщательно я не тестил, может кому понадобится тоже. Критика приветствуется.

ЗЫ. Версия - 0.1.5

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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