Как правильно сделать редирект
#1
Отправлено 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-м редиректом или может есть какой-то более простой способ без дополнительных запросов к БД.
#2
Отправлено 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(); } } ?>
Может поможет...
#3
Отправлено 20 June 2012 - 01:39 PM
ну так это то о чем я писал, дополнительные запросы....... я вот сижу думаю как обойтись без них.Может поможет...
#4
Отправлено 20 June 2012 - 02:02 PM
Могу узнать у человека который мне делал, к вечеру отвечу.ну так это то о чем я писал, дополнительные запросы....... я вот сижу думаю как обойтись без них.Может поможет...
#5
Отправлено 20 June 2012 - 07:24 PM
А как ты без допзапроса обойдешься? Все равно ведь надо брать соответствие "старый_URL->новый_URL" из какой-либо таблицы соответствий. Наиболее просто держать его в SQL-таблице, т.е. по любому запрос. Но запрос будет один и при индексировании поля "старый_URL" запрос будет совершенно ерундовым по нагрузке.я вот сижу думаю как обойтись без них
Я тоже делал такой редирект в своем ЧПУ и тоже пришлось делать для старых ссылок еще один запрос к той же табличке. Кстати! Запрос-то делается только тогда, когда уже выяснилось, что под ЧПУ-ссылки (name_category.html, name_product.html) ссылка не подходит.
Т.е. если ссылка ЧПУ-шная, то лишних запросов нет. Если не ЧПУ-шная, то приходится делать один дополнительный запрос "обратного" соответствия и редирект 301. Если и на него ни одной записи не находится, значит Error 404.
У gsm-group, насколько я по диагонали посмотрел, тоже не "запросы", а "запрос". Один. Один из. В случае, если в url (Т.е. в $_GET) присутствуют элементы "старого типа". Если их нет, то и запроса нет .ну так это то о чем я писал, дополнительные запросы.
#6
Отправлено 20 June 2012 - 08:42 PM
А как ты без допзапроса обойдешься? Все равно ведь надо брать соответствие "старый_URL->новый_URL" из какой-либо таблицы соответствий.
Думаю ты таки прав. А без запроса думал ЧПУ адрес пересекается где-то с ID уже в запросе, вот и думал может как-то его оттуда вытянуть..... ну да фиг с ним видимо самый верный вариант с доп. запросом. Да и действительно он не всегда будет.
#7
Отправлено 20 June 2012 - 09:10 PM
Пересекается, но радости от этого никакой. ЧПУ-ссылка разрешается (в терминологии DNS) в неЧПУ-ссылку. Из этого разрешения, как и в DNS, никак не выудить "обратного разрешения" и обязательно придется делать еще один запрос.А без запроса думал ЧПУ адрес пересекается где-то с ID уже в запросе, вот и думал может как-то его оттуда вытянуть.
Другими словами, у тебя есть таблица соответствий А[n]<->B[m]. Один-к-одному, т.е. каждому элементу А соответствует один элемент В и наоборот. Приход ЧПУ ссылки означает, что ты должен найти элемент B, который соответствует элементу А. Но если на вход поступила неЧПУ ссылка, то для правильного редиректа тебе надо найти ОБРАТНУЮ связь, т.е. какому элементу B соответствует элемент А. Для этого по любому надо делать еще одну выборку, обратную, т.к. прямая выборка для такой ссылки не подходит.
В терминах SQL-запросов это выглядит так:.
1. пришла ЧПУ-ссылка. Запрос выглядит как SELECT B WHERE A=ссылка.
2. пришла неЧПУ-ссылка. Запрос выглядит как SELECT A WHERE B=ссылка. И дальше редирект на пункт 1.
Очевидно, что объединить их не получится принципиально и можно только выбрать, какой из запросов делать первым, предполагая, что второй запрос с большой вероятностью уже не понадобится. Ведь мы не знаем изначально, какая ссылка пришла - ЧПУ или неЧПУ.
#8
Отправлено 20 June 2012 - 11:16 PM
#9
Отправлено 20 June 2012 - 11:42 PM
Тогда можно в robots.txt написать:
Disallow: /catalog/
Если ненужных урлов нет в индексе и на сайте с ЧПУ, то и дублям неоткуда взяться.. но это сработает, если они еще не проиндексированы...
#10
Отправлено 20 June 2012 - 11:45 PM
А что если просто убрать ненужную _http://site.ru/product_127.html из индексации поисковиков и все? Запретив формат такой записи в robots.txt, только для этого нужно ввести какой-нибудь каталожный идентификатор, чтобы все старые урлы были такие: _http://site.ru/catalog/product_127.html Тогда можно в robots.txt написать:
Это обязательно нужно сделать, но тут вопрос в другом стоит, если сайт новый то проблемы нет, а если сайт уже проиндексирован и стоят ссылки в старом виде, то хоть закрывай хоть нет дубли будут.
#11
Отправлено 21 June 2012 - 12:31 AM
#12
Отправлено 21 June 2012 - 12:55 AM
Если уже в индексе - не ломай голову, сделай по дедовски ))) через запросы, все равно при наличии заглушки в robots.txt старые ссылки постепенно отомрут, кстати их можно и удалить (по-моему даже пакетно) их индекса по крайней мере Яндекса (может у Google тоже есть), если там присвоены права на сайт в Яндекс.Вебмастере.
Удалить ссылки на сотнях ссылающихся сайтов? Ты о чем вообще говоришь?
#13
Отправлено 21 June 2012 - 01:01 AM
Я же не призываю завалить 20 хостингов с ссылающимися сайтами и потереть им бэкапы ))))
#14
Отправлено 22 June 2012 - 12:32 PM
#15
Отправлено 22 June 2012 - 01:31 PM
Да интересный вариант, но увы только под гугл, а как быть с яшейБлизко к теме: http://support.googl...u&answer=139394
#16
Отправлено 22 June 2012 - 03:32 PM
И это очень странно. Ввели они эту фишку где-то в районе 2009-го года, а Яндекс обычно не оставляет без внимания полезные фишки конкурентов.а как быть с яшей