Htaccess redirect

301 редирект

Редирект – это способ переадресации пользователей и поисковых роботов на 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 (сортировка каталога по разным критериям).
  • Для кросс-доменов, когда контент на двух адресах может дублироваться, но он должен быть на каждом из доменов.

lucky-seo.com

Редирект .htaccess: постоянное перенаправление, 301

Подобная штука имеет разные названия. Непонятки может вызвать разве что число — почему же 301? Суть кроется в самом протоколе HTTP, который на запросы клиента отвечает определённым кодом состояния. Код 404 Not Found (Страница не найдена) известен почти всем. Код 200 OK почти не известен, но именно он означает, что всё в порядке и документ будет показан в браузере. А вот код 301 Moved Permanently означает, что документ окончательно перебрался на новый адрес. Именно его и называют чаще всего перенаправлением, хотя общий пул ответов обозначен как — 3xx: Redirection.

В общем случае, для безусловного внешнего (назовём его пользовательским) редиректа, при котором браузер автоматически переадресовывается на другую страницу, обычно незаметно для пользователя (изменяется адресная строка), можно в .htaccess поместить такой код:
RewriteEngine On
RewriteRule .* http://newsite.ru/ [L,R=permanent]


Здесь, первая строка включает механизм модуля mod_rewrite, который позволяется вытворять с адресами всё, что угодно. Назовём это преобразованием URL по условиям на лету. Вторая строка определяет непосредственно правило для преобразования, в примере выше все запросы редиректятся на http://newsite.ru/. В квадратных скобках размещаются флаги: L — последнее (Last) правило, R — тип перенаправления (Redirect), указывается в виде R=code, где code — буквенное или числовое обозначение (permanent или 302).

Этот способ хорош, когда вам неважно, на какую страницу нового сайта ссылаться. Но если вы переехали на другой домен, то желательно делать редиректы всех запросов с сохранением адресов. Для этого используйте такой код:
RewriteRule ^.*$ http://newsite.ru/$0 [QSA,L,R=permanent]
Новый флаг QSA сохранит так же и параметры, которые можно встретить в адресах после знака вопроса. В уже знакомом примере:

https://a-panov.ru/?p=389

если я размещу в .htaccess код выше, то произойдёт перенаправление на адрес http://newsite.ru/?p=389 чего без данного флага не было бы.

Как настроить редирект на www (или без www)

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

Вариант попроще, для одного домена. Перенаправление производится с поддомена www.site.ru на site.ru:
RewriteCond %{HTTP_HOST} ^www.nsite.ru$
RewriteRule .* http://nsite.ru/$0 [QSA,L,R=permanent]


Здесь появилась новая директива RewriteCond, которая задаёт условие, при котором должны срабатывать редиректы — правила RewriteRule. Условие, в данном случае, имя домена, соответствующее www.nsite.ru (в регулярных выражения символ точки означает «любой символ», поэтому его желательно экранировать с помощью обратного слеша).

Обратное перенаправление тоже выполнить очень просто:
RewriteCond %{HTTP_HOST} ^nsite.ru$
RewriteRule .* http://www.nsite.ru/$0 [QSA,L,R=permanent]

Оба варианта рабочие, но у них есть маленький минус — для каждого нового конфига необходимо заменять домен nsite.ru на свой собственный. Нельзя ли сделать уникальный вариант? Легко!

Редирект с любого поддомена www:
RewriteCond %{HTTP_HOST} ^www.(.*)$
RewriteRule .* http://%1/$0 [QSA,L,R=permanent]

Редирект на поддомен с www:
RewriteCond %{HTTP_HOST} !^www.
RewriteRule .* http://www.%{HTTP_HOST}/$0 [QSA,L,R=permanent]

Как создать .htaccess

Такие вопросы тоже возникают. Проблема в том, что стандартный Проводник (приложение в Windows, отвечающее за графический интерфейс) не позволяет создавать файлы, начинающиеся с точки (созданием файлов или папкок осуществляется щелчком правой кнопкой на рабочем столе или в окне, и выбора нужного действия из списка Создать).
выход есть: открывайте стандартный рекдатор Notepad (блокнот), в меню выбираете Файл → Сохранить как…, и в качестве имени сохраняемого файла указываете .htaccess — после этого он будет создан.

Файл .htaccess не работает

Бывают случаи, когда директивы из файла не работают. Обычно это вызвано тем, что в конфигурации Apache отключена поддержка .htaccess, за что отвечает директива:
AllowOverride none

Обычно это делается, чтобы несколько увеличить быстродействие — в этом случае веб-сервер не производит поиск и разбор .htaccess.

Возможен и такой вариант, что на сервере не используется Apache, например, IIS — основной «гость» на Windows-хостинге. Для уточнения свяжитесь с поддержкой своего хостера.

Есть ли какой-нибудь аналог .htaccess в nginx?

Ещё один довольно частый вопрос. В этом веб-сервера такой возможности нет. Однако, подобное обычно и не требуется. Дело в том, что nginx, как правило, устанавливается в качестве фронденда, т. е. принимает и обрабатывает все запросы, которые либо выполняет сам, либо перенаправляет на бэкенд, роль которого может выполнять Apache, который можно дополнительно конфигурировать с помощью .htaccess.


a-panov.ru

Советы

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

Старайтесь не делать редирект на страницу ответ которой отличен от кода 200. Т.е. редирект должен переадресовывать на существующую страницу с 200 ответом сервера.

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

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

Используется когда страница переехала с одного URL на другой. Например старый URL страницы /page-1/ необходимо сделать 301 редирект на URL http://mysite.com/new-page-1/

Redirect 301 /page-1/ http://mysite.com/new-page-1/  

или

RewriteCond %{REQUEST_URI} ^/page-1/$  RewriteRule ^.*$ http://mysite.com/new-page-1/? [R=301,L]  

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


301 редирект домена с www на без www так же называется канонизацией домена или склейкой. Например делаем редирект с http://www.mysite.com на http://mysite.com, т.о. главное зеркало сайта это http://mysite.com

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

или

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

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

Также как и в случае описанным выше это еще называется канонизацией домена или его склейкой. Например 301 редирект с домена http://mysite.com на домен http://www.mysite.com, т.е. главное зеркало это www.mysite.com

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

или

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

301 редирект со страниц со слешем на страницы без слеша в конце URL

Часто бывает так что одна и та же страница доступна по двум URL, например /may-best-page и /my-best-page/, если человеку понятно что это одна и та же страница, то поисковые системы понимают это как две разные страницы, соответственно разбивают вес страницы, а также показываются в аналитике (статистике) как 2 разные страницы. Для того, что бы избежать этого вы можете сделать 301 редирект со страниц со слешем в конце URL на без него.

RewriteCond %{REQUEST_URI} !?  RewriteCond %{REQUEST_URI} !&  RewriteCond %{REQUEST_URI} !=  RewriteCond %{REQUEST_URI} !.  RewriteCond %{REQUEST_URI} ![^/]$  RewriteRule ^(.*)/$ /$1 [R=301,L]  

Такой редирект будет работать следующим образом:

Запрос (URL) Редирект (URL)
http://mysite/page/ http://mysite/page
http://mysite/page/?value=1 http://mysite/page?value=1
http://mysite/page.html/ http://mysite/page.html
http://mysite/page?value=1/ http://mysite/page?value=1
http://mysite/page без редиректа
http://mysite/page.html без редиректа
http://mysite/page?value=1 без редиректа

301 редирект со страниц без слеша на страницы со слешем в конце URL

Причина делать такой редирект та же, что и в ситуации описанным выше, за исключением того, что редирект необходимо делать со страницы без слеша в конце URL на страницу со слешем в конце URL

RewriteCond %{REQUEST_URI} !?  RewriteCond %{REQUEST_URI} !&  RewriteCond %{REQUEST_URI} !=  RewriteCond %{REQUEST_URI} !.  RewriteCond %{REQUEST_URI} !/$  RewriteRule ^(.*[^/])$ /$1/ [R=301,L]  

Пример работы редиректа:

Запрос (URL) Редирект (URL)
http://mysite/page http://mysite/page/
http://mysite/page.html http://mysite/page.html
http://mysite/page?value=1 http://mysite/page/?value=1
http://mysite/page/ без редиректа
http://mysite/page/?value=1 без редиректа

301 редирект со всех страниц одного домена на главную страницу другого домена

К примеру вам необходимо сделать 301 редирект с любого URL текущего сайт (к которому относиться .htaccess) на домен http://mysite.com

RewriteCond %{REQUEST_URI} (.*)  RewriteRule ^(.*)$ http://mysite.com/ [L,R=301]  

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

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

RewriteCond %{REQUEST_URI} (.*)  RewriteRule ^(.*)$ http://mysite.com/$1 [L,R=301]  

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

Если у вас на сайте есть SSL сертификат и работает протокол https, то для 301-го редиректа вам необходимо добавить в .htaccess следующий код:

RewriteCond %{HTTPS} !=on  RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]  

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

И обратный пример, если у вас нет SSL сертификата и протокол https не работает:

RewriteCond %{HTTPS} =on  RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]  

Удаляем несколько слешей подряд в URL и делаем 301 редирект

Если по случайности у вас появились URL такого вида: mysite.com/page///my-page, то можно сделать 301-й редирект без дублирования слешей:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$  RewriteRule . %1/%2 [R=301,L]  

Удаляем подряд несколько тире (дефисов) и делаем 301 редирект

Как в ситуации с повторяющимися слешами в URL может появиться несколько тире или дефисов, для 301-го редиректа с их удалением добавляем код:

RewriteCond %{REQUEST_URI} ^(.*)--(.*)$  RewriteRule . %1-%2 [R=301,L]  

Вырезать из URL index.php

Пример без GET параметров, например с mysite.com/index.php на mysite.com/

RewriteCond %{REQUEST_URI} /index.php  RewriteCond %{QUERY_STRING} ^z  RewriteRule ^(.*)$ http://mysite.ru/? [R=301,L]  

Пример с GET параметрами, например с mysite.com/index.php?value=1&p=3 на mysite.com/?value=1&p=3

RewriteCond %{REQUEST_URI} /index.php  RewriteRule ^(.*)$ http://mysite.ru/ [R=301,L]  

Несколько примеров совмещения 2-х редиректов в один

Для избежания последовательных редиректов можно использовать совмещенные варианты.

301 редирект с www на без www и со слешем в конце URL

Комбинируем 301 редирект с www на домен без www и 301 редирект со страниц без слеша на страницы со слешем в конце

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

301 редирект с без www на с www и со слешем в конце URL

Комбинируем 301 редирект с домена без www на домен с www и 301 редирект со страниц без слеша на страницы со слешем в конце URL

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

301 редирект с без www на с www и без слеша в конце URL

Комбинируем 301 редирект с домена без www на домен с www и 301 редирект со страниц со слешем на страницы без слеша в конце URL

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

301 редирект с www на без www и без слеша в конце URL

Комбинируем 301 редирект с www на домен без www и 301 редирект со страниц со слешем на страницы без слеша в конце URL

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

кодер.укр

Памятка по используемым символам и обозначениям

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

Спецсимволы, используемые в правилах и их значения.

  • ^ — спецсимвол начала строки;
  • $ — спецсимвол конца строки;
  • ! — спецсимвол отрицания;
  • . — точка, заменяет любой символ, но только один;
  • () — группировка;
  • — «экранирующий» слеш, следующий символ после него считается обычным, а не спецсимволом;
  • # — начало текстового комментария в файле.

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

  • ? — символ повторяется 0 или 1 раз.
  • + — повторяется от 1 до 65536 раз.
  • * — повторяется от 0 до 65536 раз.

Флаги, задают доп. опции для используемого правила. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].

  • NC — флаг NoCase, отключающий проверку регистра символов при срабатывании правила.
  • R — флаг Redirect, производит процесс остановки изменения URL-адреса и возвращает результат. Чаще всего используется значение R=301, но возможны и другие для временных перенаправлений (302, MOVED TEMPORARY).
  • L — флаг Last, останавливает формирования URL-адреса и строка считается окончательной.

pixelplus.ru

Полезные советы

  • Современные браузеры по умолчанию используют кеширование для редиректов. Чтобы проверить работу редиректа необходимо очистить кеш в браузере или использовать любой сторонний сервис по проверке кода ответа сервера.
  • Нежелательно создавать цепочки редиректов. При медленной работе сервера это вызовет недовольство пользователя. Поисковые роботы также не любят последовательные редиректы — вес исходной страницы может не передаться.
  • При составлении файла .htaccess простые директивы должны идти раньше сложных, которые распространяются на весь сайт. Такая компоновка будет более удобной при работе с файлом и поможет избежать путаницы.

Наиболее популярные правила

Приведенные примеры работают для серверов функционирующих на APACHE, для NGINX настройки в файле .htaccess работать не будут. В примерах используется %{QUERY} — так обозначается часть URL, которая следует после знака вопроса. Правила для редиректа срабатывают только при условии соответствия правилу указанному в редиректе.

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

  Options +FollowSymLinks
RewriteEngine On

301 редирект все страниц без WWW на страницы с WWW

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

Обратный редирект со страниц с WWW на страницы без WWW

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

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

  Redirect 301 /oldpage.html http://mysite.ru/newpage.html  

Переадресация для разделов через RewriteRule

  RewriteRule ^papka /papka-new/$1 [R=301,L]  

301 редирект для страниц имеющих Get-параметры в URL

Для наглядности примера допустим адрес страницы имеет вид http://mysite.ru/catalog/index.php?IBLOCK_ID=5&SECTION_ID=15. Следующее правило будет делать переадресацию:

  RewriteCond %{QUERY} ^IBLOCK_ID=5&SECTION_ID=15$ [NC]
RewriteRule ^catalog/index.php$ /newcatalog/? [R=301,L]

Иногда необходимо настроить редирект для изменяющихся Get-параметров, например в текущем примере динамическим параметром будет SECTION_ID:

  RewriteCond %{QUERY} ^IBLOCK_ID=5&SECTION_ID=(.*)$ [NC]
RewriteRule ^catalog/index.php$ /newcatalog/? [R=301,L]

Переадресация со страниц без значения Get-параметра

Например адрес страницы имеет вид — http://mysite.ru/?addon, тогда редирект будет следующим:

  RewriteCond %{QUERY} ^addon$ [NC] 
RewriteRule ^$ /? [R=301,L]

Переадресация одного адреса, без вложенных адресов

Например довольно часто необходимо настроить переадресацию со страницы раздела http:/site.ru/razdel/, однако прочие страницы в данном разделе должны работать без редиректа, например страница http://mysite.ru/razdel/section.php?SECTION_ID=1. Для этого нужно добавить всего один символ — $.

  RewriteRule ^razdel/$ http://mysite.ru/new-razdel/ [R=301,L]  

Настройка кириллических доменов .РФ

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

301 редирект с одного домена на другой

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

Правило для доменов .РФ

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

Редирект на папки со слешем на конце

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

Редирект на папку без слеша — убираем слеш на конце

  RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L]

Переадресация с домена в папку другого сайта

RewriteCond %{HTTP_HOST} ^oldsite.ru$ [NC]
RewriteRule ^(.*)$ http://newsite.ru/oldsite/ [R=301,L]

Редирект со всех страниц кроме определенной папки

Для примера возьмем в исключение папку панели администратора в CMS Bitrix

  RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301] 
RewriteRule ^(.*)$ http://mysite.ru/ [L,R=301]

Переадресация всех файлов папки на конкретный файл

  RewriteRule ^papka(.*)$ /my-file.html [L,R=301]  

Переадресация файлов папки на другой файл с исключением

  RewriteRule ^papka/file.html /new-file.html [L,R=301]
RewriteRule ^papka(.*)$ /my-file.html [L,R=301]

Редирект замены расширений файлов — с html на php

  RedirectMatch 301 (.*).html$ http://newsite.ru$1.php  

Указываем порядок загрузки индексных файлов в корне

  DirectoryIndex index.php index.html index.htm index.shtml  

Редирект с index.php на корень сайта

  RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/  RewriteRule ^index.php$ http://mysite.ru/ [R=301,L]   

Редирект всех индексных страниц на корень

  RewriteRule ^(.*)index.php$ http://mysite.ru/$1 [R=301,L]  

Переадресация с поддомена на основной домен

  RewriteCond %{HTTP_HOST} ^abc.mysite.ru$ [NC] 
RewriteRule ^(.*)$ http://mysite.ru%{REQUEST_URI} [R=301,NC,L,QSA]

Редирект страницы из различных директорий

Если в разных папках сайта лежит файл с одинаковым названием, то настроить переадресацию этих файлов на один.

  RewriteRule [^abc]/nash-file.php /nash-file.php [R=301,L]  

Создаем ЧПУ-копию динамических страниц

Для страницы появится обычный URL без передачи Get-параметров.

  RewriteRule ^catalog/okno/?$ /firma/okna/detail.php?ID=123 [NC,L]  

Переадресация с https на http

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

  RewriteCond %{HTTPS} "on"  RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA]  

Настройка ответа 403 для спама по REFERER

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

  RewriteCond %{HTTP_REFERER} ref-spam-site.ru [NC,OR] 
RewriteCond %{HTTP_REFERER} another-ref-spam.ru [NC]
RewriteRule .* - [F]

Обработка ошибки 404 в .htaccess

Для поисковых систем очень важно получать код ответа 404 для несуществующих страниц

ErrorDocument 404 /404-for-me.php

Особенности настройки

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

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

Включение редиректа для определенных User Agent

Например редирект на мобильную версию для планшетов и смартфонов:

  RewriteCond %{HTTP_USER_AGENT} (iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|j2me|symbian|series 60|symbos|windows mobile|windows ce|ppc|smartphone|blackberry|mtk|bada|windows phone) [NC] 
RewriteRule (.*) http://m.mysite.ru/ [L,R=301]

Настройка редиректов для всех поисковых роботов

  RewriteCond %{HTTP_USER_AGENT} !(accoona|ia_archiver|antabot|ask jeeves|baidu|dcpbot |eltaindexer|feedfetcher|gamespy|gigabot|googlebot |gsa-crawler|grub-client|gulper|slurp|mihalism|msnbot|worldindexer |ooyyo|pagebull|scooter|w3c_validator|jigsaw|webalta|yahoofeedseeker |yahoo! slurp|mmcrawler|yandexbot|yandeximages |yandexvideo|yandexmedia|yandexblogs|yandexaddurl|yandexfavicons |yandexdirect|yandexmetrika|yandexcatalog|yandexnews |yandeximageresizer) [NC] 
RewriteRule (.*) http://no-rank-site.ru/ [L,R=301]

Синтаксис и символы

  • . — Точка означает любой символ.
  • [abc] — перечень символов, совпадающих с буквами a, b, или с.
  • [^abc] — перечень символов, не входящих в диапазон. Условию соответствует любой символ, кроме a, b, с.
  • * — предыдущий символ может повторяться 0 и более раз.
  • [abc]* — найти символы из заданного набора идущие подряд.
  • [^abc]* — обратная операция.
  • .* — замена любого набора символов. «.*» — найти все подстроки между кавычками.
  • ^ — обознает начало строки (при использовании в начале выражения).
  • $ — конец строки.
  • w — буква, цифра или подчёркивание _.
  • d — любая цифра.
  • D — любой символ, кроме цифр.
  • [0-9] — указание на любую цифру.
  • [a-z] — указание на любую букву от a до z с нижним регистром.
  • [A-Z] — указание на любую букву от A до Z с верхним регистром.
  • [a-zA-Z] — любая буква от a до Z, регистр не важен.
  • [a-Z] — тоже самое, только короче.

Флаги для доп. опций

  • NC — NoCase отключает проверку регистра символов при срабатывании правила.
  • R — Redirect останавливает изменение URL-адреса и возвращает результат. Самое популярное значение R=301, однако встречаются и другие для временных редиректов (302, MOVED TEMPORARY).
  • L — Last останавливает создание URL-адреса и строка считается окончательной.

canwas.ru

Редирект 301 (301 Permanent Redirect) используется в нескольких случаях: при смене домена, при переносе страницы сайта, для склейки имени сайта с www и без него. Это важно для передачи Page Rank (PR) и сохранения поискового трафика.

Сам я столкнулся с его необходимостью, когда после переезда своего портала из зоны com, в ru обнаружил, что Google, Яндекс и другие поисковые системы, естественно не «забывают» старого сайта (отчасти еще и из-за того, что у меня была некорректно установлена своя страница, для обработки 404 ошибки, которая возвращала код ответа 200 OK). Более того, Google за полгода оставил для нового сайта PR=0, хотя для старого он сохранился PR=4.

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

301 редирект это наилучший метод сохранения ваших позиций в поисковых системах, когда вы переносите страницу или сайт. Код «301» интерпретируется как постоянное перемещение («moved permanently»).

  1. Простой редирект (в файле .htaccess или httpd.conf для Apache):

    Redirect 301 / http://www.you.com/new.htm
    где:
    Redirect 301 — это инструкция, говорящая что страница перемещена
    / — означает, что все с верхнего уровня сайта, включая все подкаталоги, будет переадресовано
    http://www.you.com/new.htm — новая страница или сайт (не забывайте поставить последний «/», если переадресация идет на сайт).

    Чтобы переадресовать только страницу, сохранив PR старой страницы:
    Redirect 301 /old/old.htm http://www.you.com/new.htm
    где:
    /old/old.htm — путь и имя старой страницы

    Аналогичный синтаксис для переадресации сайта:
    RedirectPermanent / http://www.you.com/

    Пример переадресации каталога:
    RedirectPermanent /old-directory http://www.domain.com/new-directory/

    Например, зашедших в test переадресуем на www.test.com, остальных на enter.test.com (порядок следования записей важен):

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

    Примечание: для моих целей (изменение домена) хватило первого варианта простого 301 редиректа.

  2. Использование mod_rewrite (прописывается в файле .htaccess):

    Ставшая классической задача слияния имена сайта с www и без него, решается так:

    Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^yoursite.com RewriteRule ^(.*)$ http://www.yoursite.com/$1 [R=permanent,L] .  

    или альтернативный синтаксис:

    Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} ^domain.com$ [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L] 

    Обозначение [R=301,L] означает: перенаправить клиента и отправить ему код статуса 301 (R=301) и сделать это правило последним (L).

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

    Options +FollowSymLinks RewriteEngine on RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L] 

    Например, если необходимо чтобы вместо rewrite.htm загружался файл rewrite.html, добавьте в .htaccess:

    RewriteEngine on RewriteBase / RewriteRule ^rewrite.htm$ rewrite.html [R=permanent] 

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

    RewriteEngine on RewriteBase / RewriteRule ^(.*).htm$ $1.html [R=permanent] 
  3. Редирект на PHP:

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

    Лучше указать HTTP/1.1, так как более старые не поддерживают виртуальный хостинг. Не забудьте, что до вызова header, ничего не должно выводиться (например, echo или print). Поэтому этот код лучше ставить в начало php-скрипта. Более полный вариант php редиректа с сохранением передаваемой страницы и параметров вызова:

    <? $ref=$_SERVER['QUERY_STRING']; if ($ref!='') $ref='?'.$ref; header('HTTP/1.1 301 Moved Permanently'); header('Location: http://newdomain.com/'.$ref); exit(); ?> 
  4. Редирект на ASP

    <%@ Language=VBScript %> <%  Response.Status="301 Moved Permanently" Response.AddHeader "Location", "http://www.new-url.com" response.end %> 
  5. Редирект на ASP.NET

    <script runat="server"> private void Page_Load(object sender, System.EventArgs e) { Response.Status = "301 Moved Permanently"; Response.AddHeader("Location","http://www.new-url.com"); } </script> 
  6. Редирект на ColdFusion

    <.cfheader statuscode="301" statustext="Moved permanently"> <.cfheader name="Location" value="http://www.new-url.com"> 
  7. Редирект с помощью meta refresh

    <meta http-equiv='refresh' content='0; url=http://newdomain.com'> 

    где 0 — задержка переадресации в секундах, newdomain.com -страница, куда переадресуем. Некоторые старые браузеры не поддерживают meta refresh со значением 0, для совместимости можно установить ненулевой значение, хотя, на мой взгляд это уже не актуально. Такой редирект не сможет склеить ваши сайты (с www и без) и передать PR, так как игнорируется поисковыми системами. Он возвращает код 200 OK, что соответствует обычной странице. Эта техника популярна у спамеров, поэтому ее стоит применять только для страниц, которые не будут индексироваться.

  8. www.rublin.org

    Создание файла .htaccess

    Первым этапом настройки редиректа .htaccess является, собственно, создание самого файла. Ваш .htaccess должен быть простым текстовым файлом. Это означает, что вам нужно создать его в программе для редактирования текста, способной генерировать файлы plain text (.txt).

    • На компьютере с Windows вы можете использовать «Блокнот», который является одной из встроенных стандартных программ.
    • На Mac вы можете использовать TextEdit. Сначала вы должны открыть меню «Настройки» в TextEdit и в разделе «Новый документ» выбрать «Простой текст». После этого вы можете начать процесс создания нового текстового документа TextEdit для вашего файла .htaccess.
    • На Linux вы можете использовать любой из многочисленных текстовых редакторов, доступных для вашего дистрибутива – как консольных (vi, nano), так и графических (к примеру, gedit).

    При сохранении документа обязательно назовите его htaccess.txt. Если вы сохраните его просто как .htaccess, ваш компьютер скроет файл. Это происходит потому, что файлы, начинающиеся с точки, считаются системными файлами.

    Загрузка файла .htaccess на сервер

    Для корректного редиректа через .htaccess файл должен быть загружен именно в тот каталог на сервере, для которого вы хотите задать настройки перенаправления. Как правило, это ваш каталог HTML-файлов (/var/www/vhosts/example.com/httpdocs/), хотя вы можете загрузить его и в любой подкаталог на вашем сервере.

    Как только файл будет загружен, переименуйте его непосредственно в .htaccess.

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

    Проверяем работу .htaccess

    Наиболее простым способом проверить, обрабатывает ли веб-сервер ваш файл .htaccess, является его намеренное повреждение.

    Отредактируйте файл .htaccess таким образом, чтобы первая строка начиналась со слова Test:

    Test

    # Установить главную страницу

    DirectoryIndex page.html page.txt …

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

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

    Немного о приоритетах редиректа .htaccess

    Правила .htaccess являются рекурсивными. То есть директивы, написанные в файле /home/user/sitename_html/.htaccess будут применяться и к этому каталогу, и к его дочерним папкам за исключением случаев, если какое-то конкретное правило отменяется с помощью директивы в файле .htaccess, находящемся в дочернем каталоге.

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

    Аналогичным образом файлы .htaccess нижнего уровня переопределяют настройки PHP в файлах vhost.conf и php.ini на более высоких уровнях, если только переопределение явно не запрещено для этих файлов.

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

    Редирект .htaccess: основные виды

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

    301: редирект на постоянной основе

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

    302: временный редирект

    Редирект 302 указывает, что старый URL-адрес страницы временно отключен, но будет восстановлен в ближайшее время. Для сервера Apache это правило перенаправления используется по умолчанию.

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

    Примеры сценариев перенаправления

    Ниже приведены наиболее распространенные примеры редиректа .htaccess.

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

    Чтобы код заработал, в веб-сервере Apache должен быть включен модуль перезаписи (mod_rewrite). Для этого требуется выполнить ряд действий в зависимости от вашей ОС.

    На Windows сделайте следующее:

    1. Найдите и откройте файл .http.conf. Он находится в каталоге, в который вы установили Apache.

    2. Создайте резервную копию http.conf, чтобы в случае необходимости восстановить файл, если вы допустите какие-то ошибки.

    3. Найдите в файле строку #LoadModule rewrite_module modules/mod_rewrite.so и раскомментируйте его (уберите знак #).

    4. Найдите блок, заключенный в тэги <directory> и замените его на <directory/> Options All AllowOverride All </directory>.

    5. Отыщите все упоминания «AllowOverride None» и везде замените их на «AllowOverride All».

    6. Перезапустите веб-сервер и ваш браузер.

    На Linux достаточно выполнить в терминале:

    sudo a2enmod rewrite

    Эта команда запустит модуль или выдаст уведомление о том, что модуль уже запущен. Чтобы привести в действие новые изменения, перезапустите Apache командой в терминале:

    sudo service apache2 restart

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

    1. Редирект с одной страницы на другую в .htaccess:

    Redirect 301 /retiredpage.html http://www.example.com/newpage.html

    2. Переадресация папки (со всем содержимым):

    RedirectMatch 301 ^/olddir/ http://www.yourdomain.com/newdir/

    3. Редирект страницы в .htaccess с удалением WWW:

    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^www.sitename.com$ [NC]

    RewriteRule ^(.*)$ http://sitename.com/$1 [L,R=301]

    4. Перенаправление с добавлением WWW:

    RewriteEngine On

    RewriteCond %{HTTP_HOST} !^www.samplehost.com$ [NC]

    RewriteRule ^(.*)$ http://www.samplehost.com/$1 [L,R=301]

    5. Редирект на другой домен в .htaccess (перенос сайта целиком):

    RedirectMatch 301 ^(.*)$ http://www.yoursite.com

    6 .htaccess-редирект файлов HTML на PHP-файлы:

    RedirectMatch 301 (.*).html$ http://www.examplesite.com$1.php

    7. Переадресация страниц с добавлением HTTPS:

    RewriteCond %{HTTPS} off

    RewriteRule (.*) https://%{SERVER_NAME}/$1 [R=permanent,L]

    8. Заменить все прописные буквы в URL-адресе на строчные:

    <IfModule mod_rewrite.c>

    RewriteMap lc int:tolower

    </IfModule>

    Данный фрагмент кода необходимо добавить в httpd.conf вашего веб-сервера. После этого требуется открыть файл .htaccess и внести:

    RewriteEngine On

    RewriteCond %{REQUEST_URI} [A-Z]

    RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

    9. Использование регулярных выражений. Правила редиректа часто содержат символы, которые складываются в регулярные выражения. Благодаря этому сервер точно знает, что вы хотите изменить в URL. Однако регулярные выражения могут быть сложными для понимания с первого взгляда. Вот некоторые общие элементы, которые вы можете увидеть и использовать в своих правилах перезаписи URL, а также конкретные примеры их использования:

    • ^ : начало заменяемой строки;

    • $ : конец заменяемой строки.

    Пример: регулярное выражение ^folder1$ дает сигнал найти и заменить текст «folder1» внутри ссылки.

    • . : любой символ, не являющийся пробелом (например, a, B, 3);

    • * : указывает, что предшествующий текст может повторяться любое число раз;

    Пример: регулярное выражение ^uploads.*$ позволяет заменить текст «uploads2009», «uploads2010» и так далее;

    Регулярное выражение ^.*$ обозначает «найти что угодно». Оно полезно в том случае, если вы не знаете, что пользователь может ввести в тексте URL.

    • () : выделяют фрагмент текста, который должен быть использован в правиле в качестве значения переменной $1. Это необходимо, к примеру, для обработки запросов к конкретным файлам, которые должны быть одинаковыми и для старой, и для новой версии URL.

    Ошибка 404 Not Found

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

    Распространенной является ошибка 404 Not Found, возникающая при переадресации. В этом случае необходимо внимательно изучить URL, сформированную в адресной строке. Существует ли нужный файл в новом местоположении на сервере, заданном правилом переадресации? Вам может потребоваться скопировать файлы из вашего старого местоположения в новое место, либо сделать правило перенаправления более широким, чтобы в случае отсутствия нужного файла по ссылке происходило перенаправление на главную страницу сайта.

    Если же URL-адрес просто неверен (например, http://example.com/folder1//file.html — обратите внимание на два слэша), вам нужно пересмотреть синтаксис правила переадресации.

    Бесконечный URL, таймаут или цикл

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

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

    Кроме того, можно включать перенаправления внутри HTML и PHP-страниц. Проверьте страницу, с которой происходит проблема, на предмет внутренних переадресаций.

    Добавление [L] после правила перенаправления может помочь в некоторых случаях, поскольку данный флаг командует серверу прекратить попытки перенаправления URL-адреса после применения правила.

    Как сделать редирект без .htaccess

    В заключение рассмотрим, как сделать перенаправление URL-адреса без редактирования файла .htaccess, используя виртуальный хост сервера Apache. Кстати говоря, этот метод проще, чем составление правил редиректа страницы в .htaccess.

    Откройте текстовым редактором конфигурационный файл vhost (httpd.conf), который обычно располагается в каталоге /etc/apache2/sites/sitename.

    Выделенный фрагмент образца файла демонстрирует перенаправление:

    <VirtualHost *:80>

    ServerName www.mysite.com

    ServerAlias www.mysite.com

    Redirect / http://mysite.com

    </VirtualHost>

    Конфигурация, приведенная выше, перенаправляет все запросы на домен без субдомена WWW.

    Чтобы перенаправить все запросы на домен с субдоменом WWW, измените конфигурацию, как показано ниже.

    <VirtualHost *:80>

    ServerName anywebsite.com

    ServerAlias anywebsite.com

    Redirect / http://www.anywebsite.com

    </VirtualHost>

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

    fb.ru

    Правила приведены для сервера Apache. В правилах: %{QUERY_STRING} — обозначает фрагмент URL-адреса после знака вопроса (задания значений CGI-параметров). Срабатывание того или иного правила для редиректа определяется тем, попадает URL-адрес страницы под это правило или нет. О значении тех или иных обозначений (^, $, NC и т.д.) см. памятку в конце страницы.

    Ниже даны наиболее используемые правила настройки файла .htaccess для 301 редиректа. Лучше размещать все правила после двух строк:

    Options +FollowSymLinks RewriteEngine On
    RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] 
    RewriteCond %{HTTP_HOST} ^www.site.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
    Redirect 301 /was.php http://www.site.ru/new.php

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

    RewriteRule ^dir /dir-new/$1 [R=301,L] 

    Скажем, адрес страницы имеет вид: http://www.site.ru/dir/index.php?IBLOCK_ID=1&SECTION_ID=111, тогда для настройки 301 переадресации на новый адрес, необходимо использовать следующее правило:

    RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=111$ [NC] RewriteRule ^dir/index.php$ /new/sef/? [R=301,L]

    Если один (или несколько) из GET параметров не задан(ы) или может иметь произвольное значение (в нашем примере это SECTION_ID), можно использовать следующий код:

    RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC] RewriteRule ^dir/index.php$ /new/sef/? [R=301,L]

    Если требуется настроить переадресацию только для адреса http://www.site.ru/dir/, но при этом чтобы страница http://www.site.ru/dir/index.php?IBLOCK_ID=1 открывалась по старому адресу, необходимо использовать спецсимвол $ в правиле.

    RewriteRule ^dir/$ http://www.site.ru/new-dir/ [R=301,L]

    Для доменов в зоне РФ действуют все те же правила, но только все кириллические символы необходимо заменить на альтернативный код (он на латинице). В частности, сама зона .рф преобразуется в .xn--p1ai.

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

    И для домена в зоне РФ:

    RewriteCond %{HTTP_HOST} ^xn-....xn--p1ai$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !..{1,10}$ RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]
    RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L]
    RewriteCond %{HTTP_HOST} ^si-te.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/si-te/ [R=301,L]
    RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301] RewriteRule ^(.*)$ http://www.newsite.ru/new/ [L,R=301]
    RewriteRule ^dir(.*)$ /new-file.php [L,R=301]
    RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301] RewriteRule ^dir(.*)$ /all.php [L,R=301]
    RedirectMatch 301 (.*).html$ http://www.new-site.ru$1.php

    Указывается порядок загрузки типов индексного файла, лежащих в корне каталога.

    DirectoryIndex index.html index.php index.htm index.shtml
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/ RewriteRule ^index.php$ http://www.site.ru/ [R=301,L]
    RewriteCond %{HTTP_HOST} ^test.site.ru$ [NC] RewriteRule ^(.*)$ http://site.ru%{REQUEST_URI} [R=301,NC,L,QSA] 
    RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L] 

    Код позволяет поставить 301-редирект со всех папок вида http://site.ruuniqe-file.html на один файл в корне /unique-file.html. Бывает полезен при переделке сайта и изменении ссылок.

    RewriteRule ^testovyi/test/?$ /studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]

    Код позволяет создать копию страницы с относительным адресом /studio/news/detail.php?ID=230354&PAGEN_2=11 по адресу /testovyi/test/

    Внимание, важно, чтобы код ответа сервера для 404 ошибки, был именно 404. Путь к файлу указывается с помощью следующей строчки:

    ErrorDocument 404 /404-for-me.php
    RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+).site.com$  RewriteRule ^(.*) http://site.com/$1 [R=301,L]
    RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+).site.com$  RewriteCond %{HTTP_HOST} !=one.site.com [NC] RewriteRule ^(.*) http://site.com/$1 [R=301,L]
    • Если требуется настроить редирект только для некоторых USER_AGENT’ов, а не для всех пользователей #

    RewriteCond %{HTTP_USER_AGENT} (iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|j2me|symbian|series 60|symbos|windows mobile|windows ce|ppc|smartphone|blackberry|mtk|bada|windows phone) [NC]

    RewriteRule (.*) http://mobile.site.ru/ [L,R=301]

    RewriteCond %{HTTP_USER_AGENT} !(accoona|ia_archiver|antabot|ask jeeves|baidu|dcpbot |eltaindexer|feedfetcher|gamespy|gigabot|googlebot |gsa-crawler|grub-client|gulper|slurp|mihalism|msnbot|worldindexer |ooyyo|pagebull|scooter|w3c_validator|jigsaw|webalta|yahoofeedseeker |yahoo! slurp|mmcrawler|yandexbot|yandeximages |yandexvideo|yandexmedia|yandexblogs|yandexaddurl|yandexfavicons |yandexdirect|yandexmetrika|yandexcatalog|yandexnews |yandeximageresizer) [NC]

    RewriteRule (.*) http://no-search.site.ru/ [L,R=301]

    Переадресация с www.site.ru/component/content/?view=featured на www.site.ru/

    RewriteCond %{QUERY_STRING} ^view=featured$ [NC] RewriteRule ^component/content/?$ /? [R=301,L]

    Переадресация с www.site.ru/index.php?idc=4&marea=6 на www.site.ru/

    RewriteCond %{QUERY_STRING} ^idc=4&marea=6$ [NC] RewriteRule ^index.php$ /? [R=301,L] 
    . — Точка заменяет произвольный символ. [abc] — обозначает перечень символов, совпадающих с буквами a, b, или с. [^abc] — перечень символов, которые не входят в указанных диапазон. Совпадёт с любым символом, кроме a, b, или с. * — означает, что предшествующий символ может повторяться (0 или более раз). [abc]* — команда найдёт идущие подряд символы из заданного набора. [^abc]* — с точностью до наоборот. .* — заменяет абсолютно любой набор символов. ".*" — найдёт все подстроки между кавычками. ^ — начало строки (в том случае, если используется в начале выражения). $ — обозначает конец строки. w — буква, цифра или подчёркивание _. d — заменяет любую цифру. D — заменяет любой символ, но не цифру. [0-9] — заменяет любую цифру. [a-z] — любая буква от a до z (весь латинский набор символов) в нижнем регистре. [A-Z] — любая буква от A до Z в ВЕРХНЕМ регистре. [a-zA-Z] — любая буква от a до Z в любом регистре. [a-Z] — то же самое. 
    RewriteRule (.*) $1? [R=301,L]

    Располагать после: RewriteBase /

    Памятка по используемым символам и обозначениям

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

    ^ — спецсимвол начала строки;
    $ — спецсимвол конца строки;
    ! — спецсимвол отрицания;
    . — точка, заменяет любой символ, но только один;
    () — группировка;
    — «экранирующий» слеш, следующий символ после него считается обычным, а не спецсимволом.

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

    ? — символ повторяется 0 или 1 раз.
    + — повторяется от 1 до 65536 раз.
    * — повторяется от 0 до 65536 раз.

    Флаги, задают доп. опции для используемого правила. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].

    NC — флаг NoCase, отключающий проверку регистра символов при срабатывании правила.
    R — флаг Redirect, производит процесс остановки изменения URL-адреса и возвращает результат. Чаще всего используется значение R=301, но возможны и другие для временных перенаправлений (302, MOVED TEMPORARY).
    L — флаг Last, останавливает формирования URL-адреса и строка считается окончательной.

    Полезные ссылки:

    • Redirect 301 – теория и практика редиректа, настройка и правила использования

    UPD:

    RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L] 

    обратно:

    RewriteCond %{SERVER_PORT} ^443$ [OR] RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://your_site.com/$1 [R=301,L] 

    ⇥ Для WordPress:

    # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]   RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L] </IfModule> # END WordPress  

     Источник 

    coderhs.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector