Тема: Общая тема по редиректам и борьбе с дублями в DLE
В этой теме предлагаю задавать свои вопросы и описывать проблемы, связанные с дублированием страниц по неверным или ошибочным адресам.
А то уже надоели создавать новые темы каждый день об одном и том же! Теперь все вопросы и все решения будут в одном месте.
Два очень важных поста на блоге:
Избавляемся от дублирования контента, связанного с URL в DLE
Redirect 301 – теория и практика редиректа, настройка и правила использования
Разрешается задавать вопросы в этом топике только после ознакомления с вышеупомянутыми постами и частыми проблемами, описанными сразу ниже.
Решение частых проблем
Дублирование страниц из-за параметров:
Пример проблемных url: site.ru/?smth=blabla или site.ru/index.php?smth=blabla
Важно: вместо smth и blabla могут быть любые названия, т.е. любые буквы или цифры, smth и blabla приведены для примера
после ?smth=blabla может идти знак & и после него еще какие-то параметры, но это не на что не влияет
Решение: Открываем .htaccess в корне (где index.php) и сразу после RewriteEngine On добавляем:
RewriteCond %{QUERY_STRING} ^smth= [NC]
RewriteRule (.*) $1? [R=301,L]
Дополнение: Если же у вас дубли вида site.ru/?smth или site.ru/page-name.html?smth то код будет таким:
RewriteCond %{QUERY_STRING} ^smth [NC]
RewriteRule (.*) $1? [R=301,L]
Дублирование страниц из-за множественных слешей:
Пример проблемных url: site.ru//index.php или site.ru//// или site.ru/page////5/ и т.д.
Важно: как вы поняли, количество слешей может быть любое и они могут встретиться в любой части url
Решение: Открываем index.php в корне и сразу после:
define ( 'ENGINE_DIR', ROOT_DIR . '/engine' );
добавляем:
$path = $_SERVER['REQUEST_URI'];
if (preg_match('#//+#', $path)) {
$path = preg_replace('#//+#', '/', $path);
header('Location: http://' . $_SERVER['HTTP_HOST'] . $path, true, 301);
}