Дубли страниц: как убрать или оставить «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
