Я не открою Америку если скажу, что грамотно оформленный URL может дать вашему сайту преимущество перед остальными в глазах поисковиков, при прочих равных. Также, роль Колумба мне светит, даже если я скажу, что для правильной обработки адресов страниц используют расширение веб-сервера Apache под названием mod_rewrite.
Но как только перед нами встает проблема обработки этих самых URL, то начинается бесконечное гугление с целью найти эти вожделенные кусочки кода для файла .htaccess, которые будут делать то, что нам нужно.
В этой статье я дам описание большинства техник обработки URL средствами mod_rewrite, которые нацелены на то, чтобы сделать ваш сайт или блог более сексапильным в глазах поисковых систем. Ориентируемся, понятно, на Google и Яндекс.
Слеши в конце URL
Google различает адреса страниц, записанные со слешем ("/") в конце URL и без него. То есть, другими словами адреса http://alexmoskovsky.ru/about и http://alexmoskovsky.ru/about/ для него являются разными. Понятно, что один из этих адресов будет признан основным и при поиске будет выводиться именно он. Но проблема в том, что когда на страницу вашего сайта оставляют где-нибудь ссылку, то одному Богу известно, какой вариант написания адреса вашей страницы (со слешем в конце или без) предпочтет человек, ставящий ссылку. Соответственно, вес будет прокачиваться как у "слешевой" страницы, так и у её бесслешевого двойника. А оно нам надо? Конечно нет, гораздо логичнее "слить" весь вес в одну из страниц. Этим мы сейчас и займемся, добавив в .htaccess следующий код:
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
Немного комментариев к коду. Первая строка отвечает за то, чтобы слеш не приписывался к запросам файлов. Вторая строка как раз и занимается определением, со слешем ли адрес или нет. Если адрес не содержит слеш в конце, то в действие вступает заключительная часть кода, делающая 301-й редирект на тот же самый адрес, но со слешем в конце.
Адрес сайта с www и без него
Все, что сказано для первого пункта, справедливо и для этого. Повторюсь: адреса http://alexmoskovsky.ru и http://www.alexmoskovsky.ru для поисковиков разные. Поэтому мы их также "сольем" в один адрес, без www, используя следующую инструкцию:
RewriteRule (.*) http://alexmoskovsky.ru/$1/ [R=301,L]
Для использования этого кода, вам нужно будет заменить адрес 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} !-d
RewriteCond %{REQUEST_URI} ^([^.]*)\.html$
RewriteRule ^([^.]*)\.html$ /$1/ [R=301,L]
Прокомментирую код. Первые две строки служат для того, чтобы окончание .html не "отрывалось" у настоящих файлов и директорий соответственно. Третья строка занимается проверко, содержит ли URL окончание .html. И если содержит, то оно будет оторвано и сервер сделает 301-е перенаправление на адрес без .html.
Внимание! Добавлять этот код нужно перед кодом из первого пункта, чтобы у сервера не было искушения приписать слеш к концу html-шного адреса! Ну или добавить в код из первого пункта инструкцию, которая заставит его проигнорировать такой формат адреса: RewriteCond %{REQUEST_URI} !(.*)\.html$
На всякий случая приведу и код, который делает с точность до наоборот — добавляет окончание .html к адресам, его не содержащим.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !([^.]*)\.html$
RewriteRule ^(.*)\/$ /$1.html [R=301,L]
Комментировать его не буду, и так все понятно из предыдущего объяснения.
Заключение
Разумеется, универсального решения для всех сайтов не существует, но приведенные выше примеры вполне подойдут для 80% сайтов с ЧПУ, в том числе и для Wordpress. Во всех остальных случаях, вам придется изучать регулярные выражения и писать правила редиректов самостоятельно. Впрочем, вышеприведенные примеры достаточно хорошо адаптируются к любому типу URL, главное — понимать принцип действия.
Если если вам понравилась эта статья, вы можете подписаться на материалы моего блога через
RSS
email
Twitter
ВКонтакте
эксперт ·
8 октября 2009 г. ·
seo
mod_rewrite
url















/index.php и просто главная страница опять-таки будут различаться в глазах того же Google. Есть вероятность, что он просуммирует вес двух этих страниц, но лучше не испытывать судьбу и поставить 301-й редирект, если конечно, эспериментировать не входит в ваши планы:)
PS: можно на «ты»:)
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]
Если не трудно подскажите как лучше решить данную проблемму. Спасибо.
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]
То есть как видите, полностью идентичный Вашему. Однако проблема двойного слеша у меня не возникает.
На данный момент у меня htaccess выглядит так
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Куда надо вставить приведенные в посте строки чтобы они срабатывали ?
Но все равно не работает. Во всяком случае на денвере.
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]
Вот так сейас выглядит. И не работает. Может еще что-то ?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Денвер вообще никак не реагирует. То есть вообще.
Как будто этих изменений файла htaccess и небыло.
Все работает и с www и без.
RewriteCond %{REQUEST_URI} !([^.]*)\.html$
а именно интерпретация !([^.]*), поясните пожалуйста?
В корневой директории лежит сотня файлов html.
Хочется привести все URL к динамическому виду (без вложенности), т.е. у всех файлов, кроме index.html заменить .html на слэш и сделать перенаправление, чтобы не оставлвалось дубля с html.
Например, хочу ссылатся на http://unisrv.ru/contact.html ссылкой Контакты и что-бы при этом был адрес http://unisrv.ru/contact/
Я прочел все комментарии и вашу статью, но ничего у меня не вышло.
Заранее благодарю )
Алексей, подскажите пожалуйста, как убрать *.html из конца адреса?
Например, хочу ссылатся на http://unisrv.ru/contact.html ссылкой Контакты и что-бы при этом был адрес http://unisrv.ru/contact/
Я прочел все комментарии и вашу статью, но ничего у меня не вышло.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html [L,QSA]
Поход в магазин электроники,благодаря новым интернет-технологиям,возможен в любое удобное для вас время.Вы без утомительных поездок по гипермаркетам,с помощью системы поиска за считанные секунды найдете интересующий вас товар и его подробную техническую характеристику.Квалифицированные консультанты ответят вам на интересующие вас вопросы.Магазин электроники
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): Обнаружено слишком много переадресаций
как это исправить все, подскажите пожалуйста