Редирект – это способ переадресации пользователей и поисковых роботов на URL адрес, который отличается от первоначально запрошенного. Существует несколько видов переадресации, некоторые из которых приведены ниже.
301 Moved Permanently
301 – постоянный редирект, который указывает на то, что запрашиваемая страница находится по новому адресу, а старый нужно считать устаревшим. Такой вид редиректа передает 90-99% ссылочной массы на новый URL.
Канонизация или склейка домена
Для склейки домена с www на без www:
RewriteCond %{HTTP_HOST} ^www.site\.com$ [NC] RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]
Для склейки домена с без www на с www:
RewriteCond %{HTTP_HOST} ^site\.com$ [NC] RewriteRule ^(.*)$ http://www.site.com/$1 [R=301,L]
Для правильного выбора метода склейки нужно рассмотреть такие факторы:
- У какого варианта выше индексация;
- У какого варианта выше позиции в выдаче;
- Канонизация слэша в конце адреса.
При создании проекта сайта нужно решить, использовать ли слэш в конце адреса. Для поисковых систем адреса вида:
- http://www.site.com/category1
- http://www.site.com/category1/
Являются разными URL. Поэтому когда решите, какого вида будут адреса у вас на сайте, нужно прописать такой код для того, чтобы убрать слэш в конце:
RewriteCond %{HTTP_HOST} (.*) RewriteCond %{REQUEST_URI} /$ [NC] RewriteRule ^(.*)(/)$ $1 [L,R=301]
или такой, чтобы добавить его:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*[^/])$ $1/ [L,R=301]
Для редиректа 301 одной страницы на другую:
Redirect 301 /oldpage.html http://www.site.com/newpage.html
Чтобы убедиться, что при запросе любой версии главной страницы, к примеру: default.htm или index.html, будет произведен редирект на каноничную страницу http://www.site.com, нужно прописывать следующий код редиректа:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*(default|index|main)\.(html|php|htm)\ HTTP/ [NC] RewriteRule ^(([^/]+/)*)(default|main|index)\.(html|php|htm)$ http://www.site.com/$1 [L,R=301]
Редирект каталога
Если в адресе у вас отображается структура каталога, то при изменениях у вас будет менять и адрес. Поэтому нужно прописывать такой редирект:
RewriteRule ^(.*)/old-catalog/(.*)$ $1/new-catalog/$2 [R=301,L]
Но бывает так, что адрес старого каталога отображается сразу после доменного имени, например www.site.com/old-catalog/. В этом случае используется такой код:
RewriteRule old-catalog /(.*) / old-catalog /$1 [R=301,L]
Редирект при изменении расширения файлов
При смене CMS обычно меняется только расширении файлов. Для канонизации страниц в этом случае нужно использовать код вида:
RedirectMatch 301 (.*)\.php$ http://www.site.com$1.html
Редирект при появлении нескольких слэшей или тире
По разным причинам бывает, что в адресе появляются лишние слэши или тире, например www.site.com/catalog////page-1.html. Такие страницы нужно переадресовывать на адреса с одним слэшем www.site.com/catalog/page-1.html.
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=301,L]
Таким же образом убираются и лишние тире в адресе, например изменение www.site.com/catalog/page—1.html на www.site.com/catalog/page-1.html.
RewriteCond %{REQUEST_URI} ^(.*)—(.*)$ RewriteRule . %1-%2 [R=301,L]
.htaccess — лишние слэши после имени домена
- http://site.com//////catalog
Чтобы убрать все эти слэши так, чтобы было перенаправление на страницу без слэшей, т.е.
- http://site.com/catalog
Нужно прописать:
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R,L]
Генерация 301 редиректов
Если технических знаний для написания собственного кода не хватает, то есть специальные сервисы генерации всех основных редиректов:
- http://www.webconfs.com/htaccess-redirect-generator.php
- http://www.rapidtables.com/web/tools/redirect-generator.htm
Здесь вы можете, вставив свои данные, мгновенно получить нужный код. Поддерживаются редиректы для доменов, url адресов, каталогов.
Как проверить 301 редирект?
После внесения любых изменений в логическую часть редиректа, нужно проверять его работоспособность. Для мануальной проверки нужно:
- Проверить работает ли вообще сайт – зайти на его главную страницу;
- Побродить по сайту, его разделам и отдельным страницам.
Но есть и сервисы для автоматической проверки редиректа:
- http://bertal.ru – очень подробные данные обо всех откликах сервера
- http://www.internetmarketingninjas.com/header-checker/
Правила использования 301 редиректа vs Canonical
Поисковая система Google устанавливает четкие правила, только при соблюдении которых, она будет верно трактовать ваши действия. Вот как буквально понимают поисковики 301 и Canonical:
- 301 редирект – данная страница является устаревшей, новая страница находится по адресу такому-то. Прошу удалить старую страницу из индекса, а новую проиндексировать и полностью передать на нее весь вес старой.
- Canonical – кроме этой версии страницы у меня есть еще и другие. Но ты, пожалуйста, индексируй только ту, на которой стоит Canonical. Другие версии будут лежать для того, чтобы их могли просматривать люди, но тебе включать их в индекс не нужно. Весь вес стоит передавать именно на страницу с Canonical.
Предпочтения по использованию редиректа 301
Обычно, это наиболее предпочтительный метод:
- Для отдельных страниц – если навсегда изменился ее адрес;
- Для доменов – если сайт будет находиться постоянно на новом домене;
- Для страниц 404 и страниц с контентом, который более не актуален. К примеру, при удалении товара из каталога можно сделать редирект на похожий по функциям товар или на страницу каталога с этим типом товаров.
Когда лучше не использовать редирект 301
- Если их реализация невозможна или она займет неоправданно много времени.
- Если контент дублируется на двух страницах, но обе они должны быть доступны пользователю ввиду некоторых отличий (к примеру, размера одежды).
- Если одна страницы имеет несколько URL (сортировка каталога по разным критериям).
- Для кросс-доменов, когда контент на двух адресах может дублироваться, но он должен быть на каждом из доменов.
Потеснить деваку с его постом решил?)
И в мыслях не было)
Очень годный материал, спасибо!
Некоторых нюансов не знал.
ПРОБЛЕМА-ВОПРОС (Joomla 2.7)
Что делать чтобы url вида http://zrobym.by/by (белорусская версия — Falang) не преобразовывался в http://zrobym.by/by.html (иначе 404), расширение задано в .htaccess и убрать с сайта нельзя — обязательное условие.
Редиректы и склейки не помогают, видимо, правило про добавление .html — сильнее.
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|?)
RewriteRule .* %1.html [R=301,L]
RewriteRule ^(.*)/$ /$1.html [R=301,L]
Решение найдено:
перед первой строкой rewriterule добавить строку
rewritecond %{REQUEST_URI} !(/by)
а чтобы игнорировались и /by и /ru можно указать такое условие:
rewritecond %{REQUEST_URI} !(/(by|ru))
Шикарная статья. Вот хотел бы спросить — какой использовать редирект 301 или 302 если меняется каталог и некоторые страницы пока еще не перенесены на новые урлы,а будут перенесены позднее?
Получается, что пока редирект будет стоять на общую страницу каталога, а потом изменится при создании нового раздела под данные страницы.
На сайте есть страницы
site.ru/1_to_2
site.ru/1_to_3
site.ru/1_to_4
site.ru/2_to_1
site.ru/2_to_3
site.ru/2_to_4
Как сделать 301-редирект, что 1 заменить на one, 2 заменить на two и т.д.
Пример:
вместо site.ru/1_to_2 чтобы было site.ru/one_to_two
Спасибо — очень помогли — в некоторых статьях были лишние тире и дефисы — сутки парился с плагинами… Низкий поклон
PS^ Скажите — если мусора в url 4-5 видов и вписать несколько правил как у Вас (например тире вместо дефиса, вот такое -–- и тому подобное) то не скажется на нагрузке на сервер?
Подскажите, есть следующего вида страницы, проиндексированные в поисковых системах:
site.ru/index.php/article
site.ru/index.php/new-blog1
Хотим сменить на:
site.ru/article
site.ru/new-blog1
Как прописать правильный редирект в .htaccess чтобы не потерялись позиции в поисковиках?
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R,L] не работает
Будте добры, подскажите, изломал всю голову, решения не нашёл ))
Проблема такая: на сайте открывается ссылка так: https://pro-babki.ru/traffic
и так: https://pro-babki.ru/?/traffic или https://pro-babki.ru/любаяхрень/traffic
Как убрать эту дичь между слешами?