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


Как правильно сделать редирект


  • Вы не можете ответить в тему
Сообщений в теме: 15

#1 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 June 2012 - 12:56 PM

В общем суть вопроса:

Есть сайт с ЧПУ.
Но страницы доступны как по старым адресам типа
_http://site.ru/category_10.html
_http://site.ru/product_127.html


так и по новым, типа
_http://site.ru/name_category.html
_http://site.ru/name_product.html

Что крайне неприятно, т.е. получаются дубли.


Сижу вот думаю с чего начать.
Сделать в index.php запрос на новый адрес и подставлять его проверяя по ID, а затем перенаправлять 301-м редиректом или может есть какой-то более простой способ без дополнительных запросов к БД.
  • 0

#2 gsm-group

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 101 сообщений
Репутация: 6
Начинающий

Отправлено 20 June 2012 - 01:27 PM

Сайт новый? Стандартные ссылки в индексе?

У меня вот такая хрень стоит, надо править под себя.
<?
if (!isset($_GET['dop_alias']))
{
	    if (isset($_GET["productIDK"]))
  {
		    $productID = (int)$_GET["productIDK"];
   $q = db_query("select alias FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$productID);
   if ($r = db_fetch_row($q))
   {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: /".$r[0].".html");
    exit();
   }
  }
  if (isset($_GET['show_aux_page']))
  {
   $q = db_query("select alias FROM ".AUX_PAGES_TABLE." WHERE aux_page_ID='".(int)$_GET['show_aux_page']."'");
   if ($r = db_fetch_row($q))
   {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: /".$r[0].".html");
    exit();
   }
  }
}

if (!isset($_GET['news_alias']))
{
  if (isset($_GET['fullnews']))
  {
   $q = db_query("select alias FROM ".NEWS_TABLE." WHERE NID='".(int)$_GET['fullnews']."'");
   if ($r = db_fetch_row($q))
   {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: /news/".$r[0].".html");
    exit();
   }
  }
}

if (!isset($_GET['alias']))
{
  if (isset($_GET["categoryIDK"]))
  {
		    $categoryID = (int)$_GET["categoryIDK"];
   $url = aliasGetUrlByIDCat($categoryID);
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: /".$url);
   exit();
  }
}
?>

Может поможет...
  • 0

#3 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 June 2012 - 01:39 PM

Может поможет...

ну так это то о чем я писал, дополнительные запросы....... я вот сижу думаю как обойтись без них.
  • 0

#4 gsm-group

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 101 сообщений
Репутация: 6
Начинающий

Отправлено 20 June 2012 - 02:02 PM

Может поможет...

ну так это то о чем я писал, дополнительные запросы....... я вот сижу думаю как обойтись без них.

Могу узнать у человека который мне делал, к вечеру отвечу.
  • 0

#5 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 June 2012 - 07:24 PM

я вот сижу думаю как обойтись без них

А как ты без допзапроса обойдешься? Все равно ведь надо брать соответствие "старый_URL->новый_URL" из какой-либо таблицы соответствий. Наиболее просто держать его в SQL-таблице, т.е. по любому запрос. Но запрос будет один и при индексировании поля "старый_URL" запрос будет совершенно ерундовым по нагрузке.

Я тоже делал такой редирект в своем ЧПУ и тоже пришлось делать для старых ссылок еще один запрос к той же табличке. Кстати! Запрос-то делается только тогда, когда уже выяснилось, что под ЧПУ-ссылки (name_category.html, name_product.html) ссылка не подходит.

Т.е. если ссылка ЧПУ-шная, то лишних запросов нет. Если не ЧПУ-шная, то приходится делать один дополнительный запрос "обратного" соответствия и редирект 301. Если и на него ни одной записи не находится, значит Error 404.

ну так это то о чем я писал, дополнительные запросы.

У gsm-group, насколько я по диагонали посмотрел, тоже не "запросы", а "запрос". Один. Один из. В случае, если в url (Т.е. в $_GET) присутствуют элементы "старого типа". Если их нет, то и запроса нет :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 June 2012 - 08:42 PM

А как ты без допзапроса обойдешься? Все равно ведь надо брать соответствие "старый_URL->новый_URL" из какой-либо таблицы соответствий.


Думаю ты таки прав. А без запроса думал ЧПУ адрес пересекается где-то с ID уже в запросе, вот и думал может как-то его оттуда вытянуть..... ну да фиг с ним видимо самый верный вариант с доп. запросом. Да и действительно он не всегда будет.
  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 June 2012 - 09:10 PM

А без запроса думал ЧПУ адрес пересекается где-то с ID уже в запросе, вот и думал может как-то его оттуда вытянуть.

Пересекается, но радости от этого никакой. ЧПУ-ссылка разрешается (в терминологии DNS) в неЧПУ-ссылку. Из этого разрешения, как и в DNS, никак не выудить "обратного разрешения" и обязательно придется делать еще один запрос.

Другими словами, у тебя есть таблица соответствий А[n]<->B[m]. Один-к-одному, т.е. каждому элементу А соответствует один элемент В и наоборот. Приход ЧПУ ссылки означает, что ты должен найти элемент B, который соответствует элементу А. Но если на вход поступила неЧПУ ссылка, то для правильного редиректа тебе надо найти ОБРАТНУЮ связь, т.е. какому элементу B соответствует элемент А. Для этого по любому надо делать еще одну выборку, обратную, т.к. прямая выборка для такой ссылки не подходит.

В терминах SQL-запросов это выглядит так:.
1. пришла ЧПУ-ссылка. Запрос выглядит как SELECT B WHERE A=ссылка.
2. пришла неЧПУ-ссылка. Запрос выглядит как SELECT A WHERE B=ссылка. И дальше редирект на пункт 1.
Очевидно, что объединить их не получится принципиально и можно только выбрать, какой из запросов делать первым, предполагая, что второй запрос с большой вероятностью уже не понадобится. Ведь мы не знаем изначально, какая ссылка пришла - ЧПУ или неЧПУ.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 June 2012 - 11:16 PM

:blink: :wacko:
  • 0

#9 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 20 June 2012 - 11:42 PM

А что если просто убрать ненужную _http://site.ru/product_127.html из индексации поисковиков и все? Запретив формат такой записи в robots.txt, только для этого нужно ввести какой-нибудь каталожный идентификатор, чтобы все старые урлы были такие: _http://site.ru/catalog/product_127.html
Тогда можно в robots.txt написать:
Disallow: /catalog/

Если ненужных урлов нет в индексе и на сайте с ЧПУ, то и дублям неоткуда взяться.. но это сработает, если они еще не проиндексированы...
  • 0

#10 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 June 2012 - 11:45 PM

А что если просто убрать ненужную _http://site.ru/product_127.html из индексации поисковиков и все? Запретив формат такой записи в robots.txt, только для этого нужно ввести какой-нибудь каталожный идентификатор, чтобы все старые урлы были такие: _http://site.ru/catalog/product_127.html Тогда можно в robots.txt написать:


Это обязательно нужно сделать, но тут вопрос в другом стоит, если сайт новый то проблемы нет, а если сайт уже проиндексирован и стоят ссылки в старом виде, то хоть закрывай хоть нет дубли будут.
  • 0

#11 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 21 June 2012 - 12:31 AM

Если уже в индексе - не ломай голову, сделай по дедовски ))) через запросы, все равно при наличии заглушки в robots.txt старые ссылки постепенно отомрут, кстати их можно и удалить (по-моему даже пакетно) их индекса по крайней мере Яндекса (может у Google тоже есть), если там присвоены права на сайт в Яндекс.Вебмастере.
  • 0

#12 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 21 June 2012 - 12:55 AM

Если уже в индексе - не ломай голову, сделай по дедовски ))) через запросы, все равно при наличии заглушки в robots.txt старые ссылки постепенно отомрут, кстати их можно и удалить (по-моему даже пакетно) их индекса по крайней мере Яндекса (может у Google тоже есть), если там присвоены права на сайт в Яндекс.Вебмастере.


Удалить ссылки на сотнях ссылающихся сайтов? Ты о чем вообще говоришь?
  • 0

#13 micehide

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 359 сообщений
Репутация: 124
Мастер

Отправлено 21 June 2012 - 01:01 AM

Ну ты так и скажи, что ты так мало вводной информации даешь ))) я же имею ввиду удалить ссылки старого вида из поисковых результатов Яндекса одним махом. Дал бы ссылку на сайт - стало бы понятнее...

Я же не призываю завалить 20 хостингов с ссылающимися сайтами и потереть им бэкапы ))))
  • 0

#14 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 22 June 2012 - 12:32 PM

Близко к теме: http://support.googl...u&answer=139394
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#15 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 22 June 2012 - 01:31 PM

Близко к теме: http://support.googl...u&answer=139394

Да интересный вариант, но увы только под гугл, а как быть с яшей
  • 0

#16 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 22 June 2012 - 03:32 PM

а как быть с яшей

И это очень странно. Ввели они эту фишку где-то в районе 2009-го года, а Яндекс обычно не оставляет без внимания полезные фишки конкурентов.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)