добавить
ссылку в
Email
Fb
подписка
RSS
Twitter
Email
Fb

Использование mod_rewrite в SEO

Я не открою Америку если скажу, что грамотно оформленный URL может дать вашему сайту преимущество перед остальными в глазах поисковиков, при прочих равных. Также, роль Колумба мне светит, даже если я скажу, что для правильной обработки адресов страниц используют расширение веб-сервера Apache под названием mod_rewrite.

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

В этой статье я дам описание большинства техник обработки URL средствами mod_rewrite, которые нацелены на то, чтобы сделать ваш сайт или блог более сексапильным в глазах поисковых систем. Ориентируемся, понятно, на Google и Яндекс.

Слеши в конце URL

Google различает адреса страниц, записанные со слешем ("/") в конце URL и без него. То есть, другими словами адреса http://alexmoskovsky.ru/about и http://alexmoskovsky.ru/about/ для него являются разными. Понятно, что один из этих адресов будет признан основным и при поиске будет выводиться именно он. Но проблема в том, что когда на страницу вашего сайта оставляют где-нибудь ссылку, то одному Богу известно, какой вариант написания адреса вашей страницы (со слешем в конце или без) предпочтет человек, ставящий ссылку. Соответственно, вес будет прокачиваться как у "слешевой" страницы, так и у её бесслешевого двойника. А оно нам надо? Конечно нет, гораздо логичнее "слить" весь вес в одну из страниц. Этим мы сейчас и займемся, добавив в .htaccess следующий код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
multitoolbox syntax highlighter

Немного комментариев к коду. Первая строка отвечает за то, чтобы слеш не приписывался к запросам файлов. Вторая строка как раз и занимается определением, со слешем ли адрес или нет. Если адрес не содержит слеш в конце, то в действие вступает заключительная часть кода, делающая 301-й редирект на тот же самый адрес, но со слешем в конце.

Адрес сайта с www и без него

Все, что сказано для первого пункта, справедливо и для этого. Повторюсь: адреса http://alexmoskovsky.ru и http://www.alexmoskovsky.ru для поисковиков разные. Поэтому мы их также "сольем" в один адрес, без www, используя следующую инструкцию:

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

Для использования этого кода, вам нужно будет заменить адрес alexmoskovsky.ru на свой собственный. Сливание адресов происходит опять таки посредством 301-го редиректа. Как вы уже, наверное, догадались — в первой строке и происходит тест на наличие в URL www-шного варианта написания адреса.

Добавление и удаление окончания .html у URL

Есть мнение, что Google ранжирует статические страницы гораздо лучше, чем динамические. Определение статична ли страница или нет, происходит, в числе прочего, и по окончанию .html у её адреса. Поясню на примере: страница http://alexmoskovsky.ru/intervyu-so-mnoj/ будет рассмотрена как динамическая, а http://alexmoskovsky.ru/intervyu-so-mnoj.html — как статическая.

Решать вам, добавлять окончание .html к URLам или нет. Я лишь приведу код, который сделает возможным вариант написания страницы с .html на конце.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^([^.]*)\.html$
RewriteRule ^([^.]*)\.html$ /$1/ [R=301,L]
multitoolbox syntax highlighter

Прокомментирую код. Первые две строки служат для того, чтобы окончание .html не "отрывалось" у настоящих файлов и директорий соответственно. Третья строка занимается проверко, содержит ли URL окончание .html. И если содержит, то оно будет оторвано и сервер сделает 301-е перенаправление на адрес без .html.

Внимание! Добавлять этот код нужно перед кодом из первого пункта, чтобы у сервера не было искушения приписать слеш к концу html-шного адреса! Ну или добавить в код из первого пункта инструкцию, которая заставит его проигнорировать такой формат адреса: RewriteCond %{REQUEST_URI} !(.*)\.html$

На всякий случая приведу и код, который делает с точность до наоборот — добавляет окончание .html к адресам, его не содержащим.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !([^.]*)\.html$
RewriteRule ^(.*)\/$ /$1.html [R=301,L]
multitoolbox syntax highlighter

Комментировать его не буду, и так все понятно из предыдущего объяснения.

Заключение

Разумеется, универсального решения для всех сайтов не существует, но приведенные выше примеры вполне подойдут для 80% сайтов с ЧПУ, в том числе и для Wordpress. Во всех остальных случаях, вам придется изучать регулярные выражения и писать правила редиректов самостоятельно. Впрочем, вышеприведенные примеры достаточно хорошо адаптируются к любому типу URL, главное — понимать принцип действия.

Если если вам понравилась эта статья, вы можете подписаться на материалы моего блога через rssRSS или emailemail, а также присоединиться ко мне в twitterTwitter или vkontakteВКонтакте.

Похожее видео
Похожие статьи
* эксперт · Дата 8 октября 2009 г. · seo  mod_rewrite  url 
RSS подписка Комментарии (28 штук)
Gravatar Tweets that mention Использование mod_rewrite в SEO | Алексей Московский -- Topsy.com 8 октября 2009 г. в 23:43 #
[…] This post was mentioned on Twitter by Алексей Московский and Алексей Московский. Алексей Московский said: Статья об использовании mod_rewrite в SEO http://bit.ly/4Gwkia […]
Gravatar Максиим 13 октября 2009 г. в 19:28 #
Хм насчет слешей не уверен — никогда не встречал. А насчет .html наконце — тоже сомнительное мнение. А вообще статья полезная :) Кстати, как насчет /index.php и просто главная страница сайта? Если лить ссылки пополам, то что?
Gravatar Алексей Московский 13 октября 2009 г. в 19:37 #
И, тем не менее, Google действительно различает страницы со слешем и без него. Насчет .html — да, спорно, но единого мнения нет до сих пор.

/index.php и просто главная страница опять-таки будут различаться в глазах того же Google. Есть вероятность, что он просуммирует вес двух этих страниц, но лучше не испытывать судьбу и поставить 301-й редирект, если конечно, эспериментировать не входит в ваши планы:)
Gravatar Never Lex 30 октября 2009 г. в 14:17 #
Как раздумываю над грамотным ЧПУ, т.к задумал написать свой блоговижок. Спасибо, статейка пригодилась.
Gravatar BOLVERIN 2 ноября 2009 г. в 14:29 #
О! Очень полезная статья. Давно подобную искал. А вы хорошо разбераетесь в построении регулярок в хтачесах? А то у меня есть пара воспросов по этой теме :)
Gravatar Алексей Московский 2 ноября 2009 г. в 14:35 #
Ну насколько хорошо, это вопрос относительный, но опыт есть. Можно прямо здесь обсудить.

PS: можно на «ты»:)
Gravatar Max 2 ноября 2009 г. в 17:56 #
Вопрос, а если будет несколько редиректов подряд? То есть сначала сервер найдёт «www.» и сделает редирект, а потом сделает редирект для добавления слеша в конец будет ли это нормально восприниматься поисковиками, или так делать не желательно?
Gravatar Алексей Московский 2 ноября 2009 г. в 17:59 #
Max, да поисковики разрулят эту ситуацию без проблем, но такого лучше не допускать, чтобы не «дергать» лишний раз сервер, напрягая его бессмысленными редиректами.
Gravatar Max 2 ноября 2009 г. в 18:14 #
Хорошо, спасибо за ответ, но тогда напрашивается такой вопрос. Как совместить два кода по удалению из урл «www.» и слешей. У меня например такой код вызывает появление двух слешей «//» в конце урл при условии что в урл введены и «www.» и обратный слеш одновременно:

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
Если не трудно подскажите как лучше решить данную проблемму. Спасибо.
Gravatar Max 2 ноября 2009 г. в 18:15 #
А кстати не будет ли при таком коде двух редиректов сразу вообще, то есть как ведёт себя сервер при таком коде? Делает два редиректа?
Gravatar Max 2 ноября 2009 г. в 18:25 #
P.S. http://inf.ru/ никак ко мне не относится, просто для примера привёл. Спасибо за ответ.
Gravatar Алексей Московский 2 ноября 2009 г. в 18:33 #
Двойной слеш появляется по причине того что в первом выражении он попадает «в скобки» (то есть в выражени (*.)). Чтобы это предотвратить, можно, например, использовать следующую запись:

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

При таком коде двух редиректов не будет, так как при выполнении первого совпавшего правила, дальнейшая интерпретация файла .htaccess прекращается. Об этом говорит директива L, указанная в квадратных скобках.

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

Кстати, на этом блоге используется следующий файл .htaccess:

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]

То есть как видите, полностью идентичный Вашему. Однако проблема двойного слеша у меня не возникает.
Gravatar Max 2 ноября 2009 г. в 18:44 #
Большое спасибо за ответ.
Gravatar Max 2 ноября 2009 г. в 18:53 #
Большое спасибо за ответ. Можно ещё один вопрос. Приведённый вами код по удалению слешей не работает при ссылке на файл. То есть урл вида http://site.ru/subdir/1.html изменяется на http://site.ru/subdir/1.html/, то есть условие для файла не выполняется. Приходится дописывать RewriteCond %{REQUEST_URI} !\.html$. Тогда всё работает. Не подскажите в чём может быть причина?
Gravatar Тимофей 2 ноября 2009 г. в 22:50 #
На денвере почему то конструкция с www не срабатывает.

На данный момент у меня htaccess выглядит так

RewriteEngine on
Options +FollowSymlinks

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

Куда надо вставить приведенные в посте строки чтобы они срабатывали ?
Gravatar Алексей Московский 3 ноября 2009 г. в 01:21 #
Тимофей, вставить их надо непосредственно после Options +FollowSymlinks
Gravatar Тимофей 3 ноября 2009 г. в 07:42 #
Спасибо за ответ.
Но все равно не работает. Во всяком случае на денвере.

RewriteEngine on
Options +FollowSymlinks

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]


Вот так сейас выглядит. И не работает. Может еще что-то ?
Gravatar Алексей Московский 3 ноября 2009 г. в 12:25 #
На первый взгляд все верно, скорее всего ошибка в конфигурации денвера. Он выдает «Internal Server Error» или просто не выполняет переадресацию?
Gravatar Алексей Московский 3 ноября 2009 г. в 12:40 #
Max, для того, чтобы это правило не распространялось на файлы и «физические» папки, нужно добавить следующие условия:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Gravatar Тимофей 5 ноября 2009 г. в 00:07 #
2 Алексей

Денвер вообще никак не реагирует. То есть вообще.
Как будто этих изменений файла htaccess и небыло.
Все работает и с www и без.
Gravatar Алексей Московский 5 ноября 2009 г. в 00:15 #
Тимофей, проблема скорее всего в его конфигурации, точно сказать не могу. Но вряд ли проблема в коде, поскольку он уже многократно опробован.
Gravatar сергей 16 марта 2010 г. в 18:22 #
и все-же непонятна запись
RewriteCond %{REQUEST_URI} !([^.]*)\.html$
а именно интерпретация !([^.]*), поясните пожалуйста?
Gravatar Иван 11 мая 2010 г. в 02:09 #
Подскажите, пожалуйста, как быть в моей ситуации!
В корневой директории лежит сотня файлов html.
Хочется привести все URL к динамическому виду (без вложенности), т.е. у всех файлов, кроме index.html заменить .html на слэш и сделать перенаправление, чтобы не оставлвалось дубля с html.
Gravatar Pravidnik 19 августа 2010 г. в 16:19 #
Алексей, подскажите пожалуйста, как убрать *.html из конца адреса?

Например, хочу ссылатся на http://unisrv.ru/contact.html ссылкой Контакты и что-бы при этом был адрес http://unisrv.ru/contact/

Я прочел все комментарии и вашу статью, но ничего у меня не вышло.

Заранее благодарю )
Gravatar Виталий 15 декабря 2010 г. в 01:15 #
Аналогичная ситуация:

Алексей, подскажите пожалуйста, как убрать *.html из конца адреса?

Например, хочу ссылатся на http://unisrv.ru/contact.html ссылкой Контакты и что-бы при этом был адрес http://unisrv.ru/contact/

Я прочел все комментарии и вашу статью, но ничего у меня не вышло.
Gravatar Виталий 15 декабря 2010 г. в 22:11 #
Пишем в .htacces следующее

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html [L,QSA]


Gravatar www.comportal.com.ua 7 мая 2011 г. в 10:25 #
Добро пожаловать в магазин электроники «Comportal.com.ua» !

Поход в магазин электроники,благодаря новым интернет-технологиям,возможен в любое удобное для вас время.Вы без утомительных поездок по гипермаркетам,с помощью системы поиска за считанные секунды найдете интересующий вас товар и его подробную техническую характеристику.Квалифицированные консультанты ответят вам на интересующие вас вопросы.Магазин электроники
Gravatar Роман 17 сентября 2011 г. в 10:46 #
Алексей Московский, подскажите, пожайлуста, как убрать .html в конце адреса, чтобы не изменять код самих файлов. Данная конструкция
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^([^.]*)\.html$
RewriteRule ^([^.]*)\.html$ /$1/ [R=301,L]
не срабатывает, кроме того делаю потом следующее
RewriteRule ^(.*)/$ $1.html [L]
вот эта строка вроде работает, но если ввести адрес неправильно, то
получается Ошибка 310 (net::ERR_TOO_MANY_REDIRECTS): Обнаружено слишком много переадресаций
как это исправить все, подскажите пожалуйста