Правильный 301 редирект. Редирект запросов без www на с-www. Редирект с помощью директивы Redirect или RedirectPermanent модуля mod_alias

Далеко не все начинающие веб-мастера знают что такое «редирект 301″ и для чего он предназначен. Как видно из названия, данное понятие состоит из двух частей:

301 — это код статуса, возвращаемого веб-сервером клиенту (браузеру);
редирект — от англ. redirect , переводится как переадресация или перенаправление.

Общение между браузером и веб-серовром

Если вы не знаете как происходит обмен информацией между клиентом и веб-сервером, то стоит остановиться на этом вопросе поподробнее. Когда вы набираете в адресной строке вашего браузера какой-нибудь адрес и нажимаете Enter, ваш браузер отправляет запрос веб-серверу, в котором указывается имя и путь к файлу который вы ходите получить. Рассмотрим несколько примеров.

В данном случае можно сказать, что браузер обращается к серверу сайт и просит возвратить документ index.php, который находится в директории /slovar-synonymov/.

А здесь браузер обращается к серверу yandex.ru, у которого есть поддомен www. Как видно на картинке, пользователь не ввёл имя файла, который необходимо получить. Но благодаря настройкам сервера, в таком случае клиенту будет отправлен документ index.html. В этом можно убедиться если ввести в адресную строку https://www.yandex.ru/index.html. В результате вы увидите всё ту же заглавную страницу Яндекса.

Можно сделать вывод, что после обращения браузера к веб-серверу, последний возвращает ему запрашиваемый документ который и отображается на экране пользователя. Но так бывает не всегда.

Что такое код статуса запроса

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



Если запрашиваемой страницы не существует, то сервер сообщает об этом клиенту с помощью специального кода статуса запроса. В данном случае код статуса будет равен 404, что видно на примере.

Если говорить правильно, то код статуса возвращается в любом случае, так как он является неотъемлемой частью протокола HTTP. Если страница существует и будет передана браузеру, возвращается код статуса 200 OK. Ниже приведены наиболее популярные коды:

200 — OK. Страница отдана клиенту;
301 — Moved Permanently. Страница перемещена по новому постоянному адресу;
304 — Not Modified. Страница не изменялась и может быть загружена из кеша браузера;
403 — Forbidden. Доступ к запрашиваемому контенту запрещён;
404 — Not Found. Документ не найден;
500 — Internal Server Error. Внутренняя ошибка веб-сервера.

Полный список статусов и их расшифровку можно найти .

В результате можно сделать вывод, что редирект 301 это код статуса запроса возвращаемого сервером в том случае, когда запрашиваемая страница была перемещена по новому постоянному адресу.

В каких случаях применяется редирект 301

Очень часто случается так, что веб-мастер меняет структуру своего сайта, после чего все статьи становятся доступны по новому адресу. Но как быть поисковым системам, которые успели проиндексировать сайт и запомнили старые адреса страниц? Своим пользователям они будут выдавать недостоверные результаты, которые скорее всего будут вести не на ожидаемую страницу, а на страницу с ошибкой 404 (Документ не найден). Для исправления данной ситуации и используется специальный код статуса 301, который позволяет перенаправить браузер по новому адресу.

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

Дубли страниц

Очевидно, что все поисковые системы стараются выдавать своим пользователям самые релевантные (максимально отвечающие запросам) результаты. А одним из основных врагов поисковых систем являются сайты, содержащие одинаковый контент. Для чего нужен интернет содержащий кучу одинаковых страниц? Представляете, если поисковик представит вам результат где, каждый сайт будет содержать одну и ту же одинаковую информацию. Очень скоро такая поисковая система перестанет пользоваться популярностью и будет влачить жалкое существование на задворках интернета.

А теперь попробуйте догадаться, что же происходит когда сайт становится доступен по адресу начинающегося с префикса www и без него. Правильно, мы получаем дубли страниц с одинаковым содержимым, но находящиеся по двум разным адресам. Такой сайт очень рискует попасть в чёрный список поисковых систем и остаться без посетителей.

Для борьбы с дублями как нельзя кстати помогает использование редиректа 301. Когда веб-сервер в ответ на запрос типа www.mysite.com, вместо искомой страницы и статуса 200 OK возвращает статус 301 Moved Permanently и новый адрес mysite.com (уже без www), это и называется использование 301 редиректа.

Аналогичным примером дублей можно назвать ситуацию, когда одна и та же страница становится доступной по адресу mysite.com/ и mysite.com/index.html. Естественно адреса взяты лишь для примера. В каждом конкретном случае адреса могут быть самыми разными (index.php, index.htm и т.д.).

Переезд сайта на новый домен

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

Как настроить редирект 301

Наконец-то можно перейти к самому главному вопросу данной статьи. Как правильно организовать редирект 301? Существует несколько способов это сделать.

Редирект 301 с помощью файла.htaccess

Использование файла.htaccess подойдёт в первую очередь тем веб-мастерам, которые не хотят вмешиваться в код своей CMS или не чувствуют уверенности в своих навыках программирования.

Простая переадресация директивой Redirect

Для перенаправления всех запросов со старого сайта на новый, создайте в корне старого сайта файл.htaccess и добавьте в него строку:

Redirect 301 / http://my-newsite.com/index.html

Redirect 301 / http : //my-newsite.com/index.html

Если вам необходимо переадресовывать не все запросы, а только относящиеся к определённым страницам, используйте следующую запись:

Redirect 301 /article.html http://mysite.com/articles/article-1.html

Общий синтаксис использования директивы Redirect файла.htaccess выглядит следующим образом:

Redirect [Код] URI_FROM URL_TO
где:
Код — это код статуса запроса который будет возвращён клиенту (необязательный параметр);
URI_FROM — путь относительно корня сайта, запросы к которому буду переадресовываться;
URL_TO — новый адрес (имеется ввиду полный адрес вида http://site.com), куда будет переадресован клиент.

Использование директивы RedirectMatch

Более гибкими возможностями обладает директива RedirectMatch, которая позволяет использовать регулярные выражения для параметра URI переадресовываемой страницы. К примеру для того, что бы организовать редирект

http://myblog.ru/09-02-2016/301-redirect/ =>
http://myblog.ru/index.php?year=2016&month=02&day=09&title=301-redirect

можно использоваться следующий код:

RedirectMatch 301 /(\d{2})-(\d{2})-(\d{4})/(.*)/$ http://myblog.ru/index.php?year=$3&month=$2&day=$1&title=$4

RedirectMatch 301 / (\ d { 2 } ) - (\ d { 2 } ) - (\ d { 4 } ) / (. * ) / $ http : //myblog.ru/index.php?year=$3&month=$2&day=$1&title=$4

Одним из недостатков данных директив является невозможность использования параметров GET передаваемых в URI. Т.е. сделать обратный редирект

http://myblog.ru/index.php?p=1 => http://myblog.ru/p-1.php

не получится.

Для того, что бы иметь возможность работать с параметрами GET необходимо использовать возможности модуля mod_rewrite.

Редирект с помощью директив модуля mod_rewrite

Модуль mod_rewrite является довольно сложным в освоении, но взамен предоставляет поистине неисчерпаемые возможности модификации URL и настройки переадресации. В основе модуля лежит использование регулярных выражений применяемых к URI запрашиваемого клиентом документа. Директива RewriteRule в случае совпадения регулярного выражения с URI, выполняет замену данной строки с возможностью использования в качестве подстановки совпавших групп регулярного выражения.

Рассмотрим несколько примеров, начиная с более сложного.

Для организации редиректа

http://myblog.ru/index.php?y=2016&m=02&d=09 =>
http://myblog.ru/2016-02-09/

необходимо добавить в файл.htaccess следующий код:

RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^y=(\d{4})&m=(\d{2})&d=(\d{2})$ RewriteRule ^index\.php$ /%1-%2-%3/?

< IfModule mod_rewrite . c >

RewriteEngine On

RewriteBase /

RewriteCond % { QUERY_STRING } ^ y = (\ d { 4 } ) & m = (\ d { 2 } ) & d = (\ d { 2 } ) $

RewriteRule ^ index \ . php $ / % 1 - % 2 - % 3 / ? [ R = 301 , L ]

< / IfModule >

Примечание: если не добавлять знак вопроса в конце строки замены директивы RewriteRule, то в результате в адресной строке браузера будет адрес вида http://myblog.ru/2016-02-09/?y=2016&m=02&d=09

Директива RewriteCond позволяет обращаться к переменным сервера применяя к ним регулярные выражения. Следующая за ней директива RewriteRule выполнится только в том случае, если совпадёт регулярное выражение в предыдущей строке директивы RewriteCond.

В качестве более простого примера использования возможностей mod_rewrite можно привести следующий. Переадресация типа

http://сайт/любое_слово => http://сайт/slovar-synonymov/любое_слово

выполняется следующим образом.

Всем-всем привет!

Темой прошлого — . Я кратко рассказал о его самых важных моментах и упомянул несколько функций, которые этот самый файл и выполняет. Одной из таких функций является автоматическое перенаправление посетителя с одного URL на другой, ее еще называют 301 редирект.

Что такое 301 редирект?

Как я уже сказал, 301 редирект — это автоматическое перенаправление, которое позволяет перенаправить посетителя или поискового робота с одной страницы сайта на другую или с одного домена на другой. При всем при этом, все, так называемые, пузомерки ( , вес страницы) передаются тому URL, на который происходит редирект.

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

Пример. Раньше блог Context-UP находился по URL: http://blog.сайт (среди Вас, наверное, есть те кто застал эти времена), затем мне захотелось, чтобы сайт находился на домене второго уровня, то есть . Для осуществления своего желания мне пришлось перенести все содержимое блога в другой каталог (папку) на хостинге, затем в панели , а , указать новый домен, чтобы роботы начали индексировать новый адрес блога. Только после всего этого, я настроил редирект в..

Теперь я надеюсь, Вы поняли, что такое 301 редирект.

Как настроить 301 редирект через htaccess?

Существует несколько способов осуществления перенаправления, но самый безопасный и простой — редирект 301 в.htaccess.

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

  1. Mod_rewrite;
  2. Mod_alias.

Наиболее предпочтительным является первый вариант, так как при его использовании Вам не нужно будет прописывать каждый URL-страницы отдельно, а достаточно только использовать специальные команды (они ниже), благодаря которым и будет происходить редирект.

Мы, то есть простые клиенты хостинг-провайдеров, способны только активировать данный модуль для своего каталога с сайтом через файл.htaccess. Делается это просто, достаточно ввести в ранее упомянутый файл строчку:

RewriteEngine On

Работать данный модуль будет только в том случае, если он подключен в веб-сервере Apache. Поэтому уточните данный момент у администраторов.

В рамках этого урока, я хочу разобрать несколько ситуаций, в которых нам понадобится настроить 301 редирект:

  1. Если вы переезжаете с одного домена на другой;
  2. Если Ваш сайт доступен с www и без www;
  3. С протокола http на https;
  4. С одной страницы на другую;
  5. С индексного файла index.html/php на главную страницу.

Пойдем по порядку.

Переезд на другой домен

В том случае, если Вы решили переехать на другой домен, то Вам нужно прописать в файле дополнительной конфигурации.htaccess следующую команду:

RewriteEngine On RewriteCond %{HTTP_HOST} old-domen.ru RewriteRule (.*) http: //new-domen.ru/$1

301 редирект с www на URL без www и наоборот

Поисковый робот — вещь сложная, поэтому при работе с сайтом, вебмастеру необходимо учитывать множество нюансов. Как пример, для поисковой машины сайт, который доступен по адресу с www (www.site.ru) и без тридаблю (site.ru), делится на два совершенно одинаковых, дублирующих друг друга, веб-ресурса.

По этой причине, любой сайт должен быть доступен только по одному адресу: либо с www, либо без. Иначе позиции сайта не будут расти.

Редирект с www.site.ru на site.ru:

Редирект с site.ru на www.site.ru:

RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.*) RewriteRule ^(.*)$ http://%1/$1

С протокола http на https

Используйте данный код для редиректа на безопасный протокол https:

RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https: //%{HTTP_HOST}%{REQUEST_URI}

С одной страницы сайта на другую

Очень часто бывает такое, что нужно перенаправить посетителей сайта и поискового робота с одной страницы на другую. В таком случае в htaccess достаточно прописать такой код:

Redirect 301 /stranica1..html

В одно время мне понадобилось сделать такой 301 редирект со страницы, которая генерируется CMS WordPress, на главную, так как первая дублировала то, что было на второй.

С index.html или index.php на корень (слеш)

Изначально, практически на всех сайтах главная страница доступна по двум URL: http://site.ru/index.php и http://site.ru/. Это не правильно, так как получается дублирование контента главной страницы и ПС начнут пессимизировать сайт в выдаче (намеренно опускать сайт вниз).

Чтобы такого не было, нужно прописать следующее:

Если Вы хотите сделать редирект с index.html

RewriteCond %{THE_REQUEST} ^{3,9}\ /index\.html\ HTTP/ RewriteRule ^index\.html$ http: //site/

Если Вы хотите сделать редирект с index.php

RewriteCond %{THE_REQUEST} ^{3,9}\ /index\.php\ HTTP/ RewriteRule ^index\.php$ http: //site/

Используйте данный материал, как шпаргалку, вдруг Вам понадобится. Достаточно просто скопировать нужный код и вставить его в.htaccess.

Ну а на этом все, дорогие друзья!

Не забывайте подписываться на обновления блога и делиться ссылками на уроки в социальных сетях.

До скорых встреч!

Предыдущая статья
Следующая статья

Про 301 редирект уже, наверное, сказано и пересказано множество раз в блогах, форумах и т.п. Но, как оказывается, не до всех эта информация вовремя доходит (тут я как бы намекаю на себя:). За более чем 3 года в сети я слышал про 301 редирект множество раз, иногда даже собирался его «попробовать», но давайте посмотрим фактам в лицо — так этого и не сделал. А зря! Все началось достаточно прозаически — у меня есть один сайт, который постоянно «колбасит» в плане индексации поисковиками. Вроде и ссылки там есть, и контент нормальный, а он все ни в какую не хочет стабильно работать. У меня уже почти закончились варианты подобного поведения, но тут я вспомнил про основы основ SEO и вообще продвижения — 301 редирект.

Беглый опрос в твиттере показал, что реально я чуть ли не один «забиваю» на этот важный момент. Большинство единогласно ответило, что в обязательном порядке устанавливает 301 редирект сразу при создании сайта. Более того, тут мне недавно попросили по разработке сайта добавить этот же самый 301 редирект для них, поскольку просьба пришла от продвигающей и конторы. Учитывая все эти моменты и «намеки судьбы» я понял 301 редиректу быть!

Зачем вообще нужен 301 редирект ? — спросите вы — есть несколько ситуаций в которых его можно применить:

  1. Для склейки домена с www и без www. При этом показатели и ссылочный вес будет совмещаться, а то иногда бывает, что для домена с и без www они могут отличаться.
  2. При смене домена со старого на новый 301 редирект позволит опять же сохранить показатели и ссылочное (насчет тИЦ не знаю, но PR точно).
  3. При переносе страницы на сайте чтобы поисковики и посетители попадали на новую страницу вместо старой неработающей.
  4. Если есть пиаристые домены со ссылками, которые по каким-то причинам вами не используются, возможно, просто некогда, то теоретически можно использовать 301 редирект на другие свои сайты. Хотя это метод такой — дополнительная возможность что ли, основные все же первые три.

Вообще 301 редирект нужен как для пользователей, так и для поисковых роботов — позволяет сориентировать тех и других, что есть новый сайт, домен, страница и без лишних вопросов переадресовывает их туда. Кроме того 301 редирект произведет склейку показателей сайтов и позволит не потерять позиции в поисковых системах.

Как сделать 301 редирект

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

Простой редирект

Производится в файле.htaccess или httpd.conf для Apache. Самый простой вариант простого 301 редиректа для переадресации на новый домен выглядит следующим образом:

Redirect 301 /site1/page1.htm http://www.site2.com/page2.htm

Вот еще парочка примеров простого 301 редиректа:

Redirect permanent /test http://www.test.com/ Redirect permanent / http://enter.test.com/

Здесь при попадании пользователя или робота в директорию test он перенаправится на www.test.com, все остальные попадут на enter.test.com. Для этого 301 редиректа на хостинге должны быть включены модули mod_alias (для поддержки Redirect, RedirectPermanent и RedirectMatch).

301 редирект с помощью mod_rewrite в.htaccess

С модулем mod_rewrite вы сталкивались достаточно часто даже не подозревая этого. В частности речь идет про постоянные ссылки (permalinks) как полезный инструмент в seo оптимизации wordpress. Если в админке настроите эти самые ссылки и после этого зайдете в файл.htaccess, то обнаружите там целый ряд правил для переадресации через директиву RewriteRule. Кроме того нужно проверить чтобы была подключена опция FollowSymLinks.

Перенаправление домена с www на без-www

Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} ^www.domain\.com$ RewriteRule ^(.*)$ http://domain.com/$1

Редирект запросов без-www на домен с www префиксом

Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.(.*) RewriteRule ^(.*)$ http://www.%1/$1

Вообще использование www в названии сайта само по себе устарело, но иногда до сих пор встречается. Если вы создаете новый сайт, то конечно сразу указываете везде без www, но если получили «готовый продукт», то нужно смотреть как домен отображается в выдаче Google и Яндекс — такой редитект и оставляете дабы ничего кардинально не менять.

301 редирект старого домена на новый:

RewriteEngine on RewriteBase / RewriteRule ^rewrite\.htm$ rewrite.html

Для замены всех.htm файлов.html файлами:

HTTP/1.1 301 Moved Permanently Location: http://www.newdomain.ru/newdir/newpage.htm

Для этого, например, в PHP используем:

"HTTP/1.1 301 Moved Permanently" ) ; header ("Location: http://www.newdomain.ru/newdir/newpage.htm" ) ; exit () ; ?>

Данный код лучше всего вставлять в начало PHP скрипта чтобы до него ничего не выводилось (echo или print). За пояснение спасибо автору этой статьи где также найдете информацию про установку редиректа на ASP, ColdFusion и т.п., просто с php самый популярный вариант.

Примечания по 301 редиректу

Напоследок пару моментов по 301 редиректу, которые нужно помнить и с которым я так или иначе столкнулся:

  • Во-первых, последовательность правил редиректа учитывается. Так что если какое-то правило не выполняется, проверьте нет ли других редиректов и не мешают ли они.
  • Во-вторых, помнить синтаксис и все особенности 301 редиректа достаточно сложно, поэтому иногда здорово помогает логика и перебор некоторых вариантов:) Хотя, конечно, лучше читать официальную документацию.
  • В-третьих, после внедрения 301 редиректа обязательно проверьте правила на работоспособность, зайдите не только на главную, но и пройдитесь по разделам, страницам сайта дабы потом не было проблем с этим.

Если у вас есть что добавить по 301 редиректу — пишите:)

P.S. Постовой. В наше время каждый день появляется множество интересных интернет проектов. Хотите знать все про стартапы тогда читайте новый увлекательный блог StartupWay.
После аудита и оптимизации веб-проекта следует комплексная раскрутка сайтов в поисковых системах Google и Яндекс.

До тех пор, пока у вас есть доступ к директории своего сайта на сервере, такие действия не составят особого труда. Будем считать, что ваш сайт работает на веб-сервере Apache (как и большинство сайтов), потому давайте немного поговорим о технической части вопроса внедрения переадресации 301 в Apache.

Сначала немного теории

В терминах сайтов, редирект – это способ автоматической переадресации конечного пользователя с одного адреса URL на другой. В то время как с технической стороны существует несколько способов осуществления переадресации, для задач, связанных с поисковой оптимизацией (SEO), мы рекомендуем использование постоянным редиректом 301 HTTP.

В отличие от используемой по умолчанию временной переадресации 302 HTTP, 301 показывает, что старый, привязанный URL больше не используется (тогда, как 302 указывает, что старый временно не используется, но в будущем он должен снова появиться).

Разница между 301 и 302 особенно важна при сканировании сайта поисковыми системами. Когда сканер поисковика обнаруживает ссылку на ваш сайт, адрес которого постоянно настроен на переадресацию, то веб-сервер взаимодействует со статусом кода 301, а затем переадресовывает пользователя на новый URL. Поисковые системы не только принимают перенаправление на новый URL, но и переносят значение показателей страницы со старого URL на новую страницу редиректа (это вторая особенность такого процесса, которая очень важна для SEO оптимизации, которую нельзя выполнить, используя 302).

Во всех примерах указан домен данного сайта, не забудьте заменить его на адрес вашего сайта.

Сравнение редирект 301 и канонический rel=”canonical”

Например:

Смысл тега rel=canonical в том, чтобы сообщить поисковой машине единый целый адрес контента страницы. Это очень полезно, когда сайт использует динамические переменные атрибутов для URL-ов. Динамические URL могут способствовать индексации нескольких версий URL для каждой отдельной страницы, что выражается в (а это поисковики просто ненавидят!)

Хотя использование тега с атрибутом rel=canonical и полезно для страницы сайта, но это не является надежной заменой переадресации 301. Здесь есть несколько причин:

Тег rel=canonical до сих пор рассматривается поисковыми машинами как полунамеки, а не как конкретные директивы к исполнению. Тогда как редирект 301 воспринимается как конкретная инструкция. И напоследок, в отличие от редиректа 301, которая может быть сконфигурирована в одном файле для всего сайта, код тега rel=canonical нужно будет вставить на каждой страничке.

Все это говорит нам, что использование тэгов rel=canonical может оказаться полезным при переадресации страниц блога (конечно, если у вас есть доступ к его коду и, чтобы вставить в страницы необходимые модульные теги). В конце концов, использование 301 может означать потерю изначальных страничек и связанных с ними комментариями, социальных связей, у которых есть свои собственные значения в SEO.

Мы рекомендуем рассмотреть использование тега rel=canonical, чтобы минимизировать дублирование индексированного контента. Независимо от стандартных причин переназначения функций и значений поискового индекса старого URL на новый, мы рекомендуем придерживаться использования проверенного способа – переадресации 301.

Как сделать редирект 301 в.htaccess?

На веб-сервере Apache редирект 301 можно выполнить через коды скрипта в одном из двух файлов с текстовой конфигурацией: или.htaccess (для директорий, представляющих отдельные сайты на сервере), или httpd.conf (в корневом каталоге инсталлятора Apache). Обычно используется способ с изменением конфигурации., потому рассмотрим его более подробно.

Первое, что нужно сделать – это открыть текстовый файл, который называется.htaccess . Его можно найти в директории вашего сайта на веб-сервере Apache. Убедитесь, что открыли его с помощью простейшего текстового редактора, такого как Notepad на компьютерах, работающих на Windows.

После открытия файла, прежде чем добавить специальный код сценария, вам необходимо выполнить две вещи:

  • Включить модуль Apache mod_rewrite.
  • Включить ReWriteEngine в модуле mod_rewrite.

Чтобы сделать это, добавьте эти две строки кода:

Options +FollowSymLinks RewriteEngine on

Заметим, что такие строки нужно добавить лишь один раз в файле.. Когда они будут добавлены, можно приступать к добавлению в сценарии кода переадресации 301.

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

Редирект 301 одной страницы на другой URL

Для того чтобы выполнить переадресацию 301 с одного URL на другой URL, вставьте следующую строку кода:

Redirect 301 /staraja.html http://www..html

В файле. htaccess можно вставить любое количество строк переадресации.

Редирект 301 всей директории и всех файлов на другой URL

Если вы переделали архитектурный дизайн сайта и переименовали директорию, необходимо выполнить переадресацию 301 на всю эту директорию. Сделать это так:

RedirectMatch 301 ^/oldname/ http://www.сайт/newname/

Переадресация 301 доменного имени на другой URL

Если вы купили доменное имя с хорошей историей, то наверняка захотите увеличить посещаемость вашего сайта. Здесь можно использовать переадресацию 301 всего трафика такого доменного имени на ваш теперешний сайт. Используйте, как пример, следующий код:

RedirectMatch 301 ^(.*)$ http://www.сайт

Убедитесь, что вы создали такое перенаправление в файле. htaccess исходного сайта, с которого будете перенаправлять трафик, а не в целевом сайте!

Переадресация 301 для канонизации на другой URL

Так как поисковые машины индексируют URL-лы, то имея разные URL-лы, которые перенаправляют для индексации на страницы с одинаковым контентом, это может повлиять на значение PageRank. Безусловно, для оптимизации такое положение не самое лучшее! Суть в том, что если вы хотите присоединить PageRank к одному (каноническому) URL, то для оптимизации поиска нужно обратить внимание на контент страниц сайта.
Когда вы изучите лучшие примеры канонизации, вы захотите применить ее на своем сайте. Это означает, что вы должны учитывать все возможные альтернативы переадресации URL на канонический URL. Используйте следующий пример кода для главной страницы сайта:

RewriteCond %{HTTP_HOST} ^web-profy\.com RewriteRule ^(.*)$ http://www..(html|php|htm)\ HTTP/ RewriteRule ^(([^/]+/)*)(default|main|index)\.(html|php|htm)$ http://www.сайт/$1

Первый блок из двух строк перенаправляет URL-лы, у которых опущены префиксы «www.», на адрес домашней страницы, например, “www.xyz.com”..сайт/.

Второй блок кода перенаправляет URL-лы указанных страниц на те адреса, которые указаны по умолчанию. Такой код гарантирует, что любой URL домашней страницы, имеющий несколько вариантов своего написания и прямых ссылок, как default.htm или index.html, будут перенаправлены на каноническую страницу URL, такую как, http://сайт

Документирование и тестирование работы

# Redirect this entire domain, abc..*)$ http://www.сайт

Хорошее документирование и комментирование процессов всегда поможет вам (и тем, кто в дальнейшем будет заниматься сайтом) понять, какой код за что отвечает. Такая информация будет полезна при поиске проблем, когда что-то не работает, выяснить какую часть кода нужно исправить для слаженной работы сайта.

Безусловно, необходимо протестировать работу внесенных изменений. Если вы используете FTP для загрузки исправленного файла. htaccess в корневом каталоге вашего сайта, самое время выполнить его проверку. Введите в браузере адрес URL страницы, которую вы перенаправили. Она должна моментально перенаправить на прописанный URL.

Поиск и устранение неисправностей

Если переадресация не работает так, как вы того ожидали, то наступает время поиска и устранения неисправностей.

Прежде всего, если переадресация закодирована в вашем файле.htaccess и оно записано корректно, но не работает, то проверьте состояние установки расширения mod_rewrite в Apache. Этот модуль обычно устанавливается по умолчанию, но если его там нет, то кодировка.htaccess, приведенная выше, работать не будет. Также убедитесь, что вы добавили две строки кода, которые разрешают работу модуля mod_rewrite и ReWriteEngine.

Кроме того, заметим, что использование в строках RewriteCond показывает о несоответствии входных данных с установленными характеристиками. Если вы упустите этот момент, адреса URL-ов с заглавными и строчными буквами могут не так работать, как ожидалось. Заметим, что использование L в коде говорит о том, что файл движка воспринимается как последняя строчка кода всего процесса подтверждения ввода данных. Если у вас противоречивая конфигурация кода в.htaccess, используйте код L в строке, обозначенной как приоритетной.

И напоследок отметим, что частое использование переадресации 301 не хорошо сказывается на здоровье всего сайта. Хоть она и очень полезна, но вы должны обновлять входящие ссылки сайта на правильные URL-лы. Игнорируя ваши старые входящие ссылки и используя для перехода через них многократно переадресацию 301 (301, затем 301, затем еще раз 301), вы увеличиваете время для загрузки сайта, что плохо сказывается на продвижении сайта. И если переадресаций будет очень много, то сканеры могут просто не дойти до целевого сайта. Если такое случается, то это вредит вашему сайту продвигаться в поисковой системе. Также, если вы обновляете ссылки вашего сайта, убедитесь, что обновляются и файлы sitemap.xml новыми обновленными URL-ми.

Контролируйте работу вашего сайта при помощи переадресации 301 – это стандартная эффективная практика при белой SEO оптимизации. Убедитесь, что вы помогаете сканерам поисковых машин добраться до страниц вашего сайта и, при этом, заработанный PageRank активно вкладывается в продвижение вашего сайта.

Привет, друзья. Сегодня хотелось бы обсудить очень заезженную, но всегда актуальную тему – это 301 Редирект (Permanent Redirect 301) – в seo-тусовке и без формальностей именно это подразумевается под словом «редирект» . Технически это является ответом сервера на обращение к нему, этот ответ имеет код 301, обозначающий, что адрес обращения был изменен навсегда (moved permanently). В результате всех этих хитрых махинаций мы должны получить какой-то новый конечный адрес.

Я считаю, что вам не нужны эти технические аспекты, а потому хочу поговорить о прикладных вещах – когда и в каких ситуациях лучше использовать редирект, каким образом и при помощи каких команд можно настроить правила переадресации и т.д . А так же рассмотрим инструменты и сервисы, при помощи которых можно проверить правильность редиректов.

Так как пост вышел очень большим, то я решил сделать оглавление для вашего удобства :

Когда НЕОБХОДИМО делать 301 редирект

В первую очередь редирект применяется, когда страница (группа страниц или целый раздел) сменила свой адрес — чаще всего это случается при изменении структуры сайта, переименовании основообразующей части url’а или смене принципа формирования адресов (проще говоря, ЧПУ). К сожалению, не все об этом задумываются, когда что-то меняют на сайте, и в итоге возникает куча дублей, что приводит к потере позиций или даже наложению санкций со стороны поисковых систем. По своей работе я очень часто сталкиваюсь с такими ситуациями, и это стоит много нервов, чтобы все исправить и нивелировать последствия. От себя могу порекомендовать перед любой работой по смене типа ЧПУ или переделке структуры составить план текущей структуры сайта, всех его разделов и примеров конечных страниц. Все это необходимо будет проверить после завершения работ, чтобы при переходе по старому адресу мы попадали на новый, а сервер отдавал редирект с кодом 301 (а не 302).

Следующий частый случай использования 301 редиректа – смена адреса сайта или склейка зеркал. Если вы решили поменять адрес сайта в связи с ребрендингом компании или зарегистрировали новый более красивый и короткий домен для указания его на печатной промо-продукции — очень важно, чтобы при обращении к адресу на старом домене пользователь попадал на ту же самую страницу (а не на главную страницу), но на новом домене. Что касается промо-сайтов, то обычно они состоят из одной-двух страниц, ссылки с которых ведут на основной сайт, или же при переходе на промо-сайт сразу происходит редирект на специальную страницу основного сайта. Еще иногда при создании сайта регистрируется сразу несколько доменов, например, из-за неоднозначного написания имени компании на латинице. Чтобы интуитивно набирая адрес, пользователь попал куда надо, и регистрируются несколько доменов – очень важно, чтобы со всех «вспомогательных» доменов происходил 301 редирект на один основной адрес. Ни в коем случае нельзя допустить, чтобы по всем адресам был доступен один и тот же сайт.

И еще о зеркалах – может случиться так, что ваш сайт будет доступен по адресам http://www.site.ru, http://site.ru и https://site.ru (последнее редко, но бывает) – это все классические ошибки, которые нельзя допускать, и в их решении как раз участвует 301 редирект. Так же как и в случае с разными адресами сайтов, необходимо определиться с главным зеркалом (с www или без www) и настроить редиректы на основное зеркало. Конечно, поисковики не глупые и в таких ситуациях часто сами справляются, а так же им можно помочь, сделав правильные настройки в панелях вебмастера и в robots.txt (для Яндекса, директива Host). Но seo – дело тонкое, и я бы не стал полагаться на удачу, а воспользовался проверенным способом!

Иногда случается очень неприятная ситуация, когда копия сайта оказывается доступной не только при вводе в адресной строке названия домена, но и IP-адрес сервера. Такая ситуация вряд ли может произойти на виртуальном хостинге, а вот если у вас выделенный сервер, то запросто. Это может являться причиной некорректной настройки сервера – решить проблему поможет отключение возможности доступа при обращении к ip-адресу, но лучше всего здесь выручит 301-редирект на уровне веб-вервера (apache или nginx). Пару месяцев назад у меня случилась как раз такая ситуация – у меня был выделенный сервер, на котором висела часть сайтов, но под один из сайтов я решил взять еще один отдельный сервер. Я перенес сайт, все работало как часы, и вот однажды натыкаюсь в выдаче Гугла на клон моего сайта – шок, паника – оказалось, что это ip адрес моего нового сервера и, разумеется, на нем живет мой сайт, а при обращении сервер отдает ответ 200 OK, и Google проиндексировал его полностью. На предыдущем сервере такой проблемы не было, там изначально был настроен 301-редирект с ip на домен, указанный в качестве основного для этого ip. Теперь я научен горьким опытом и всегда проверяю такие вещи – будьте в курсе и вы, не повторяйте ошибок. Проблему решили путем добавления в конфиги веб-сервера nginx 301 редиректа на основной домен, пример кода покажу в практической части поста ниже.

Ситуация подобная предыдущей – когда копия сайта находится и доступна через служебный тестовый домен , например, вида site.hosting.ru. Такие случаи в моей практике тоже встречаются, и, в отличие от предыдущего случая, это свойственно как раз для виртуального хостинга. Для чего такое существует? Например, у вас еще не куплен домен или вы переносите сайт с одного хостинга на другой, а NS сервера для домена не сменили, или еще не обновились записи DNS у провайдера. В таких ситуациях и делают тестовые адреса, где вы можете все настроить и установить, прежде чем перенаправлять адрес сайта на новый хостинг. И вот некоторые хостеры грешат тем, что не закрывают доступ к таким техническим адресам и при этом даже не запрещают их индексацию. Если и у вас случилась эта неприятная ситуация, то стоит попробовать прописать 301-редирект с технического адреса на основной в файле.htaccess.

Ну и, конечно же, 301 редирект очень любят применять правильные сеошники для борьбы с различными дублями страниц. Почему только правильные сеошники? Да потому, что неправильные хуй забили на сайт клиента и, что вполне вероятно, даже не заходя на сайт, стали закупать ссылки – увы, это не редкость. Ко мне периодически обращаются заказчики, которые хотят проверить добросовестность своих подрядчиков/сотрудников, отвечающих за оптимизацию и продвижение сайта, насколько качественно идет работа – – и пока еще ни разу не было такого, чтобы я не нашел на сайтах ошибок или недоработок. Так что, имейте в виду – я всегда рад вам помочь. Вернемся же к дублям – я считаю, что вместо того чтобы закрывать дубли от индексации, необходимо делать редирект на основной адрес, а это уже не так интересно. Разумеется, существует масса случаев, когда дубли вынужденные, и тогда без канонизации не обойтись, но если есть возможность сделать редирект, обязательно делайте его. Частые случаи дублей, которые необходимо проверять всегда: адреса со слешем на конце и без, адреса с параметрами и метками – как это решать, я расскажу ниже.

Когда МОЖНО делать 301 редирект

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

Redirect 301 можно использовать в качестве ответа сервера вместо ошибки 404 Not Found – другими словами, пользователь, перейдя по неправильной ссылке или на несуществующую страницу, увидит не сообщение, мол, «Извините, такой страницы больше нет», а будет перемещен на другую существующую страницу. Это очень спорный момент среди специалистов, а потому я свое мнение никому не навязываю. Но я предпочитаю использовать именно редирект вместо 404 ошибки, и тут существует несколько вариантов развития событий… Смотрите, есть 2 категории 404 ошибок: первая – классическая, когда страницу действительно удалили, вторая – когда появление ошибки связано с кривыми внешними ссылками. В первом случае, наверное, не стоит делать редирект, а оставить 404 ошибку как она есть. А вот во втором случае стоит озаботиться редиректом на правильный url-адрес, если его можно восстановить из битой ссылки, или редиректом на главную страницу (или категорию).

Когда НЕ СЛЕДУЕТ делать 301 редирект

Несколько слов о том, когда редирект может вам навредить, а потому его не стоит использовать в следующих ситуациях.

Самое главное, чтобы не наделать ошибок, не стоит связываться с редиректами, если вы на 100% не уверены в том, что вы делаете или в чем-то сомневаетесь. Примите это как дружеский совет:)

Перманентный редирект не стоит использовать для временных решений , это очевидно из его названия – для временного перемещения используйте 302 Moved Temporarily. При этом не произойдет склейки страниц и страницу с редиректом можно будет в любое время восстановить.

Если с вашим доменом случились проблемы, например, фильтры, бан и т.п., и вы решили сменить адрес сайта (домен), то не стоит делать 301 редирект со старого домена на новый — в результате вы «приклеите» к новому домену и все проблемы старого. То есть в итоге ничего и не изменится. Да, было какое-то время решение выхода из под гугло-фильтра Пингвин при помощи полного 301-редиректа со старого домена на новый. Действительно все позиции восстанавливались до уровня как до санкций, и это казалось панацеей от злого Пингвина, но при очередном апдейте алгоритма эта особенность была учтена и новый домен так же попадал под фильтр, в итоге ничего не улучшалось после смены домена. Если уж вы решили сменить домен, то можно попробовать перенести весь контент на новый домен, а на старом его удалить и повесить заглушку с сообщением о переезде, а еще лучше начать все «с нуля».

Существует очень много способов сделать 301-редирект: через htaccess, php, javascript, настройки сервера и т. д. – так вот не надо пытаться использовать сразу все методы одновременно , слишком велика вероятность «разногласий» между разными способами и можно, например, получить бесконечное циклическое перенаправление.

Когда вы работаете со сложной структурой сайта или перерабатываете большой портал, часто случаются множественные редиректы или длинные цепочки. Это значит что редирект происходит не в один шаг, а в два и более – это плохая ситуация и ее надо по возможности избегать. При переходе по такой ссылке поисковый робот, получив несколько перенаправлений подряд, может подумать, что его обманывают и прекратить следовать дальше и вообще перестать учитывать ссылки. Вот вам пример из моей практики, однажды мне на аудит попался сайт с такой неожиданной цепочкой:

http://site.ru/tax/term/30 ->
http://www.site.ru/tax/term/30 ->
http://www.site.ru/tax/term/30/ ->
http://www.site.hosting.ru/404.php ->
http://www.site.ru/404.php

А еще в итоге страница http://www.site.ru/404.php, которая должна отдавать 404 ошибку, отдает ответ 200 OK. Это даже мне взорвало мозг, а представьте, что подумал бы поисковый робот, попав в такую карусель! Мало того, что в цепочке поучаствовали три разных домена, так еще и страница ошибки говорит, что она не ошибка и ее надо индексировать.

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

Составляя привила редиректов в.htaccess исключайте реальные адреса директорий и файлов на сервере и следите за выборкой. Ситуация для сайта, попавшего мне однажды на аудит – в борьбе с дублями страниц категорий со слешем на конце и без, вебмастер перестарался немного и наоборот только усугубил проблему. Мало того, что под правила перезаписи попали и реальные файлы js-скриптов и css-стилей из-за чего они перестали корректно работать, так еще и некоторые страницы получили ненужный слеш на конце и появились дубли. Друзья, тщательно следите, чтобы составленные правила распространялись только на ту группу адресов, с которой вы работаете, и ограничивайте все остальные.

Для поиска проблемных страниц и их адресов, от которых необходимо избавиться, используйте возможности панелей вебмастера от Яндекс и Google. Для Яндекса Вебмастер: Выбираем сайт –> Индексирование сайта –> Исключенные страницы. Для Google Webmaster: Выбираем сайт –> Оптимизация –> Оптимизация HTML; А так же: Выбираем сайт –> Конфигурация –> Параметры URL.

Особенности индексации и переиндексации редиректов в Яндекс и Google. Когда вы будете бороться с дублями и проблемными адресами, разумеется, вы будете ждать удаления ошибок из панелей вебмастера, тут есть некоторые особенности. С Google все просто – настроили редиректы, изменения проиндексируются в течение 2 недель, за это же время начнут исчезать ошибки и из панели вебмастера, обычно через месяц все ошибки пропадают. С Яндексом же есть тонкость, и заключается в следующем – после простановки редиректов можно ждать пропадания ошибок из панели вечно, я ждал однажды полгода, пока не написал в поддержку, где мне сообщили, что помимо редиректа необходимо дополнительно закрыть проблемные страницы в robots.txt и только тогда они пропадут из панели вебмастера.

Permanent Redirect 301 через.htaccess

Такой способ установки редиректов является самым популярным и простым. Хотя, признаться, далеко все не так просто, как кажется, так что я планирую написать отдельный пост про htaccess. Из плюсов данного способа можно отметить, что редирект срабатывает на уровне сервера и до запуска обработки любых скриптов сайта и не несет дополнительной нагрузки.

У вас на сервере (в корне, там где главный index.php) уже наверняка есть файл.htaccess. Если этот файл не видно:

  • Проверьте настройки ftp-менеджера, он может скрывать системыне файлы, коим и является файл htaccess
  • Зайдите в файловый менеджер через панель управления хостера и проверьте права для файла. Я имею ввиду не CHMOD, а группу и пользователя, например, там может стоять пользователь root, а вы подключаетесь через ftp используя доступ пользователя владельца домена.
  • Банально файла может не быть:) Тогда его следует создать, но под windows иногда возникает проблема, т.к. по сути файл.htaccess видится системой как файл без имени и только с расширением. Предлагаю простой способ – создаем обычный txt-файл, добавляем в него строку «RewriteEngine On» (без кавычек), загружаем txt-файл на сервер, на сервере переименовываем файл в.htaccess

Большинство правок, связанных с редиректом следует писать в самом начале файла после строки «RewriteEngine On» , чтобы эти правила обрабатывались в первую очередь. Важно соблюдать последовательность действий, т.к. команды обрабатывается сервером построчно с самого начала и до первого вхождения. Иначе говоря, надо всегда начинать с частной и заканчивать более общей выборкой.

Давайте рассмотрим несколько самых распространенных и полезных примеров:

301 редирект для домена с www.site.ru на site.ru

RewriteCond %{HTTP_HOST} !^www\.(.*) RewriteRule ^(.*)$ http://www.%1/$1

Вышеописанные варианты редиректа отлично работают и не требуют никаких правок с вашей стороны — только вставить в.htaccess файл. Однако для 100% надежности я бы посоветовал вам другой вариант:

RewriteCond %{HTTP_HOST} !^www.site.ru$ RewriteRule ^(.*)$ http://www.site.ru/$1

RewriteCond %{HTTP_HOST} !^www.site.ru$ RewriteRule ^(.*)$ http://www.site.ru/$1

RewriteCond %{HTTP_HOST} !^site.ru$ RewriteRule ^(.*)$ http://site.ru/$1

RewriteCond %{HTTP_HOST} !^site.ru$ RewriteRule ^(.*)$ http://site.ru/$1

Первый для тех, у кого основной домен с www, второй – у кого без www. Соответственно в обоих примерах надо вместо «site» вписать название вашего домена.
Итак, чем же данные варианты лучше? Очень просто, они проверяют не только отсутствие/наличие www в имени домена, но проверяют и имя домена на полное его соответствие.
Живой пример: Наверняка вы сталкивались с тем, что неожиданно сайт может проиндексироваться по служебному адресу на хостинге (такой адрес выдается, чтобы к сайту можно было обратиться до привязки вашего реального домена), какому-нибудь зеркалу или вообще ip-адресу! Так вот универсальные правила будут лишь верифицировать отсутствие/наличие www, при этом все равно, к какому домену обращается пользователь или поисковый робот.
Так вот воспользовавшись продвинутым вариантом, вы на 146% будете уверены, что ваш сайт будет доступен только и исключительно по указному лично вами доменному имени и с учетом www. Я пользуюсь только таким вариантом и вам рекомендую!

301 редирект с http на https

В свете массового перехода сайтов на защищенный протокол, необходимо знать, как сделать редирект с http на https. Кстати, если вы еще не выбрали SSL-сертификат, вам стоит прочитать мой пост про .

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

RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

RewriteCond %{SERVER_PORT} !^443 $ RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI}

RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI}

RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}

RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}

RewriteCond %{HTTP:X-HTTPS} !1 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

RewriteCond %{HTTP:X-HTTPS} !1 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}

Редирект с протокола https на http (честно, не знаю, зачем вам может это понадобиться):

RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1

RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1

Недавно я написал очень подробную инструкцию . Если вы планируете переезд с https на https, вы обязаны ее прочитать!

Внесу некоторую ясность в непонятную абракадабру:

  • RewriteCond обозначаем условие, при совпадении с которым будет выполнено правило RewriteRule. С помощью регулярных выражений задаются шаблоны строк.
  • Переменные сервера:
    • %{REQUEST_URI} — часть урла без доменного имени и GET-параметров, например, для страницы, которую вы сейчас читаете: blog/post/4393 ,
    • %{HTTP_HOST} — хост или доменное имя, например: сайт
    • %{QUERY_STRING} — строка с набором GET параметров, то есть часть урла после знака вопроса (и до решётки якоря, если он есть).
    • %{REQUEST_FILENAME} — полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу..php , а вот в файловой системе сервера это страшная строка /var/www/сайт/data/www/сайт/index.php .
      Бывает, делая редирект, вы получаете неожиданный результат, например, хотели в адресе http://site.ru/page-name?post=17434801_4060 убрать параметры post=17434801_4060 , указали соответствующие правила (о них ниже будет написано), а в итоге получили строку http://site.ru/usr/local/www/site.ru/www/page-name — от параметров избавились, но получили странный адрес. Это все потому, что вы не указали в начале файла после RewriteEngine On директиву RewriteBase /, которая устанавливает конкретный, базовый URL для преобразований в контексте каталога.
  • Метасимволы используются для задания групп символов или «меток» в шаблоне:
    • ^ — метка начала строки,
    • $ — метка конца строки,
    • ! – отрицание,
    • \ — экранирующий слеш, позволяет считать следующий за ним метасимвол обычным символом,
    • . – точка, обозначает любой символ, но только один,
    • () – группировка.
  • Модификаторы ставятся после обычных символов, метасимволов или их групп и расширяют возможности использования шаблонов:
    • ? — символ повторяется 0 или 1 раз,
    • * — Повторяется от 0 до 65536 раз,
    • + — Повторяется от 1 до 65536 раз.
  • Флаги определяют дополнительные опции для данного правила и перечисляются в квадратных скобках через запятую:
    • NC — (nocase) отключает проверку регистра символов.
    • R — (redirect) останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (302, MOVED TEMPORARY). С данным флагом можно указать другой код результата, например R=301 возвратит редирект с кодом 301 (MOVED PERMANENTLY). Как вы понимаете, это то самое, что нам и надо.
    • L — (last) останавливает процесс преобразования, и текущая ссылка считается окончательной.

Самый популярный случай — 301-редирект с index.php (html) на главную страницу. На 90% сайтов встречается проблема дублирования главной страницы по адресам http://site.ru и http://site.ru/index.php (или index.html, index.htm или любой другой вариант, не принципиально, а то и все сразу). Где-то это явно, когда, например, ссылка из логотипа ведет на site.ru, а ссылка в меню ведет на site.ru/index.php, где-то не явно, когда дубль находится при вводе адреса с index.php вручную. Важно просто решить проблему. И я предлагаю универсальный вариант, вот он:

RewriteCond %{THE_REQUEST} ^{3 ,9 }\ /index\.(php|html|htm)\ HTTP/ RewriteRule ^(.*)index\.(php|html|htm)$ $1

RewriteCond %{THE_REQUEST} ^{3,9}\ /index\.(php|html|htm)\ HTTP/ RewriteRule ^(.*)index\.(php|html|htm)$ $1

Просто вставьте этот код без изменений после строки после строки «RewriteEngine On» и нет проблем!

Многие, кто начинает бороться с дублями на сайте, задаются вопросом, а откуда берутся такие вот ссылки , которые дублируют основную страницу http://site.ru/page-name.html&post=-1234567_8901 ? Откуда взялась приставка &post=-1234567_8901 – это «добро» берется из вконтакте, когда кто-то делится ссылкой на ваш сайт у себя на стене, в группе или паблике, то автоматически добавляется подобная строка, видимо, для отслеживания какой-то статистики.

Чтобы избавиться от этой ерунды раз и навсегда необходимо добавить в htaccess:

RewriteCond %{REQUEST_URI} ^(.*)\&sa= RewriteRule ^(.*)\&sa=(.*)$ $1

Как видите, никакой разницы между этим и предыдущим случаем нет, пусть у вас в url"е будет &post= или &sa= или что угодно — решение одинаковое, просто надо заменить очевидные части кода. Понятно же, правда?

Избавляемся от параметров или меток в адресе

Вопрос задавался и в комментариях и много раз на форуме, потому нельзя его обойти стороной. Что делать вот с такими дублями: http://site.ru/?abrakadabra или более реальный случай http://site.ru?utm_source=twitterfeed&utm_medium=twitter

Данный случай немного отличается от следующего пункта, где мы будем избавляться от параметров для php-скрипта, так как тут обычный адрес и параметры в скрипт мы не передаем. Вот решение:

RewriteCond %{QUERY_STRING} ^lang=ru$ RewriteRule ^(.*)\.php\?(.*)$ $1\.php

%{QUERY_STRING} — это строка с набором переменных для PHP, часть урла после знака вопроса (и до решётки якоря, если он есть).

Вызываем url — http://site.ru/index.php?lang=ru

RewriteCond %{QUERY_STRING} ^lang=ru $
Запрашиваемый url попадает под это правило, других правил нет, поэтому будет выполнен RewriteRule строкой ниже.
RewriteRule ^(.*) \.php\?(.*) $ $1 \.php

Исходный url: http://site.ru/index .php?lang=ru
Шаблон разборки url’а: ^(.*) \.php\?(.*) $
URL будет разобран по переменным: $1 = http://site.ru/index , $2 = lang=ru и собран обратно уже в виде http://site.ru/index .php ($1 \.php)
А далее будет 301 редирект на новый url.

Пример правил при смене структуры сайта

RewriteRule ^post/category/(.*)$ blog/category/$1 RewriteRule ^post/(.*)$ blog/post/$1

RewriteRule ^post/category/(.*)$ blog/category/$1 RewriteRule ^post/(.*)$ blog/post/$1

Вот такие строки мне пришлось добавить в htaccess файл, когда я сменил структуру своего блога.

Раньше у меня были адреса такие: http://сайт/post/4358 и http://сайт/post/category/seo, что как-то ломало логику в структуре – ведь блог это только часть сайта, но почему-то посты принадлежат сайту, а не блогу, а категории принадлежат постам, что тоже совсем нелогично..info/blog/category/seo — теперь блог как отдельный раздел сайта, а посты принадлежат ему, и категории принадлежат блогу, а не постам.

Из этого же примера видно, что важно соблюдать последовательность правил. Если бы я поменял строки местами, то есть впереди бы шла строка RewriteRule ^post/(..info/blog/post/category/seo а не как надо на http://сайт/blog/category/seo.

И последний пример — разбор частой ошибки с адресом от корня сервера

Например, вы решили исправить такую проблему, когда страница категории доступна по двум адресам http://site.ru/razdel/podrazdel/index.php и http://site.ru/razdel/podrazdel/. Второй url является правильным и основным, а url с index.php на конце является полным дублем, от которого необходимо избавиться.

Для того чтобы сделать редирект с index.php на категорию вы прописываете правило:

RewriteEngine On RewriteBase /

301-редирект со страницы на страницу, на новый адрес

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

Redirect 301 /page-name1.html http://site.ru/page-name2.html Redirect permanent /page-name1.html http://site.ru/page-name2.html RedirectPermanent /page-name1.html http://site.ru/page-name2.html

Redirect 301 /page-name1.html http://site.ru/page-name2.html Redirect permanent /page-name1.html http://site.ru/page-name2.html RedirectPermanent /page-name1.html http://site.ru/page-name2.html

Выбирайте один из трех, а лично я предпочитаю первый вариант — он короче, проще и понятнее. Кстати, здесь site.ru может быть не обязательно тем же самым доменом, но любым другим.

На этом закончим с.htaccess и перейдем к PHP.

Permanent Redirect 301 с помощью PHP

Обычно PHP редирект я использую, когда возникают трудности с.htaccess или оказывается так, что функция на php оказывается более логичной и понятной.

Сам синтаксис 301 редиректа на php выглядит следующим образом:

header (); header ("Location: http://site.ru" ); die("Redirect" );

header("HTTP/1.1 301 Moved Permanently"); header("Location: http://site.ru"); die("Redirect");

Эти строки сообщают браузеру клиента, что с какой-то запрошенной страницы необходимо произвести перманентный редирект на адрес http://site.ru. При этом http://site.ru может являться не только адресом главной страницы текущего сайта, но может быть и любым другим сайтом. Если же что-то пошло не так и произошла ошибка, то в окне браузера мы увидим надпись «Redirect».

Чтобы было понятнее, приведу несколько примеров функций, которые я написал для своего блога сайт, пытаясь решить определенные задачи.

Функция, позволяющая убрать определенный кусок из url

if (strpos($_SERVER["REQUEST_URI" ], "http://сайт" ) !== false) { $real_page_url = "http://сайт" .str_replace ("/http://сайт" , "" , $_SERVER["REQUEST_URI" ]); header ("HTTP/1.1 301 Moved Permanently" ); header ("Location: $real_page_url" ); die("Redirect" ); }

if (strpos($_SERVER["REQUEST_URI"], "http://сайт") !== false) { $real_page_url = "http://сайт"..1 301 Moved Permanently"); header("Location: $real_page_url"); die("Redirect"); }

Однажды у меня возникла проблема, что в панели вебмастера вылезла куча 404 ошибок, адреса этих страниц были вида http://alaev..е. откуда-то в адресе появился дублирующий адрес сайта. И тогда я написал функцию, которая проверяет, есть ли в URI (заметьте, не URL, а URI) вхождение «http://сайт», и если присутствует, то вырезаем из адреса этот кусок и записываем результат в переменную $real_page_url, а потом делаем 301-редирект на верный адрес из переменной.

Функция, убирающая конечный слеш из url

if (($_SERVER["REQUEST_URI" ], - 1 , 1 ) == "/" ) { $requested_url = rtrim($requested_url, "/" ); header ("HTTP/1.0 301 Moved Permanently" ); header ("Location: $requested_url" ); die("Redirect" ); }

if (($_SERVER["REQUEST_URI"], - 1, 1) == "/") { $requested_url = rtrim($requested_url, "/"); header("HTTP/1.0 301 Moved Permanently"); header("Location: $requested_url"); die("Redirect"); }

Вот такая вот простейшая функция, которая смотрит, есть ли в запрошенном адерсе страницы слеш на конце, и если он есть, то слеш обрезается и происходит 301-редирет на адрес без слеша.

Существует еще масса вариантов, позволяющих отдавать команду перенаправления на разных языках программирования, типа ASP, Ruby on Rail и т.д., но я с этими языками не знаком, потому не буду тут умничать и пудрить вам мозги. Еще возможны редиректы при помощи метатега meta refresh, а так же редиректы на javascript – но это участь нечистых на руку дорвейщиков, а поисковики эти редиректы не понимают, они получаю ответ от сервера 200 OK. Так что эти варианты мы не рассматриваем.

Permanent Redirect 301 для сервера nginx

Помните я писал про зеркало моего сайта, доступного по ip? В итоге проблему решили редиректом, прописанным в конфигурационном файле сервера, обычно он расположен тут /etc/nginx/nginx.conf. Там прописали вот такие строки:

server { listen 1.2.34.123:80 default; server_name _; rewrite ^/(.*)$ http://site.ru/$1 permanent; }

server { listen 1.2.34.123:80 default; server_name _; rewrite ^/(.*)$ http://site.ru/$1 permanent; }

Здесь говорится о том, что если идет обращение в ip-адресу через 80-ый порт, то необходимо делать permanent redirect на site.ru.

Однако техподдержка не рекомендовала мне так поступать со словами: «Более корректно будет настроить HTTP-сервер таким образом, чтобы он просто закрывал соединение, если к нему обращаются по адресу, который не указан явным образом в конфигурации HTTP-сервера, это наиболее надёжный, простой, безопасный и наименее требовательный к ресурсам сервера вариант. Через некоторое время страницы, которые будут недоступны, скорее всего, будут выкинуты из индекса поисковых систем.»

Следующий совет был такой: «Когда потребуется просто закрывать соединение вместо перенаправления, то укажите вместо строки "rewrite ^/(.*)$ http://site.ru/$1 permanent;" такую строку "return 444;". Затем выполните: "invoke-rc.d nginx reload"».

Вдруг это кому поможет.

Примеры редиректов в самых распространенных случаях

Редирект для домена www.site.ru на site.ru

server { listen 80; server_name site.ru; rewrite ^ http://www.site.ru$request_uri? permanent; }

Редирект с адреса http://site.ru/index.php на http://site.ru/

location = /index.php { if ($request_uri = /index.php) { rewrite ^ http://$host? permanent;#301 redirect } fastcgi_pass unix:/tmp/fastcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

location = /index.php { if ($request_uri = /index.php) { rewrite ^ http://$host? permanent;#301 redirect } fastcgi_pass unix:/tmp/fastcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

Вот как-то так. Я в настройках конфигов для nginx не силен, всегда обхожусь настройками апача, так что, если у вас появились какие-то вопросы по nginx, то я вряд ли смогу вам помочь...

Как проверить HTTP заголовки и статусы ответа сервера

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

Дополнение HttpFox для Firefox

HttpFox (вот ссылка на аддон) — это мой любимый инструмент отслеживания http-заголовков. HttpFox построчно показывает ход загрузки страницы, что позволяет отслеживать, например, цепочки редиректов и вообще порядок и скорость загрузки страницы. Если вы пользуетесь Мозиллой, то однозначно рекомендую.

Расширение HTTP Headers для Chrome

Сам я не пользуюсь расширением HTTP Headers (вот ссылка на него), но интернеты мне посоветовали обратить внимание именно на него. Если у вас есть варианты получше, пожалуйста, отпишитесь в комментариях.

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