Дубли страниц: как убрать или оставить «www»

Не секрет, что начинающие вебмастера не уделяют много внимания тому, по какому адресу доступен их сайт: с префиксом «www» или без него. Отчасти потому, что все современные веб-сервера настроены корректно отрабатывать оба случая.

Поисковые же роботы — наоборот, кушая странички, вкрадчиво заглядывают в глаза и тихим умным голосом вопрошают:

— Я понимаю, что оба варианта доступны, но хотелось бы уточнить…

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

Напрашивается вывод: надо дать понять неразумным цифровым организмам, что оба адреса, с www и без, относятся к одному и тому же содержимому. Разумеется, с помощью понятного им средства выражения мыслей, а именно — 301-го редиректа (redirect, перенаправление). Сделать это можно разными путями.

Используем .htaccess для устранения дублирования

Если у вас есть доступ к управлению поведением сервера через этот файл, то это самый простой и экономичный в плане нагрузки на сервер способ, так как перенаправление в случае «не того» запроса произойдет ещё до срабатывания скриптов сайта (да и статический HTML тоже отдавать по запросу не надо будет).

Для успеха операции требуется установленный на сервере mod_rewrite. Не встречал ещё случая, чтобы его не было на хостинге. Для начала включим его для всего сайта:

RewriteEngine on
RewriteBase /

Затем объясним серверу, что все запросы без «www» следует перебрасывать на тот же адрес, только с приставкой «www»:

RewriteCond %{HTTP_HOST} ^avolberg\.ru [NC]
RewriteRule (.*) http://www.avolberg.ru/$1 [L,R=301]

Понятно, что вместо avolberg.ru надо вписать свой домен. А? Что вы говорите? Наоборот надо? Убрать «www»? Запросто, правило там вообще универсальное, даже вписывать самому ничего не надо:

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Перенаправляем средствами PHP

Если вы боитесь лезть в файл с таким страшным названием, или администраторы вашего (бесплатного?) хостинга боятся, что вы там зверски накосячите, и закрыли доступ, то придется написать пару программных строчек. Реализовать можно по-разному, функций работы со строками много. Ключевой момент заключается в анализе элемента суперглобального массива $_SERVER['HTTP_HOST'], в котором и содержится имя сервера, по которому производится запрос (www.server.com или server.com).

Итак, поборемся с дублями при помощи PHP. Возьмем функцию preg_match() для проверки вхождения подстроки «www» в имя сервера и реализуем сначала перенаправление на адрес без приставки «www»:

// Если в имени сервера ЕСТЬ www.avolberg., то...
if (preg_match('/www.avolberg./i',$_SERVER['HTTP_HOST'])) {
  // Выдать заголовок 301-го редиректа
  header("HTTP/1.1 301 Moved Permanently");
  //Собрать новый адрес БЕЗ www
  header("Location: http://" . preg_replace('/www.avolberg./i', 'avolberg.', $_SERVER['HTTP_HOST']) . $_SERVER['REQUEST_URI']);
  //Прекратить работу за ненадобностью
  exit();
}

И наоборот, оставим «www»:

// Если в имени сервера ОТСУТСТВУЕТ www.avolberg., то...
if (!preg_match('/www.avolberg./i',$_SERVER['HTTP_HOST'])) {
  // Выдать заголовок 301-го редиректа
  header("HTTP/1.1 301 Moved Permanently");
  //Собрать новый адрес С ПРИСТАВКОЙ www
  header("Location: http://" . preg_replace('/avolberg./i', 'www.avolberg.', $_SERVER['HTTP_HOST']) . $_SERVER['REQUEST_URI']);
  //Прекратить работу за ненадобностью
  exit();
}

Изменилость только условие (появилось логическое отрицание «!») и замена теперь уже простого имени сервера, на имя с приставкой.

У кого вдруг другой язык и сервер, алгоритм всё равно тот же, просто функционал будет выглядеть по-другому.

27.02.2011 | 11:45




 
Добавить комментарий