Введение. Правила приведены для сервера Apache. В правилах: %{QUERY_STRING} — обозначает фрагмент URL-адреса после знака вопроса (задания значений CGI-параметров). Срабатывание того или иного правила для редиректа определяется тем, попадает URL-адрес страницы под это правило или нет. О значении тех или иных обозначений (^, $, NC и т.д.) см. памятку в конце страницы.
Ниже даны наиболее используемые правила настройки файла .htaccess для 301-редиректа. Лучше размещать все правила после двух строк:
1 2 |
Options +FollowSymLinks RewriteEngine On |
301-редирект с домена без WWW на домен с WWW префиксом #
1 2 |
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] |
С домена с WWW префиксом на без #
1 2 |
RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L] |
С домена с WWW префиксом на без включая все поддомены (домены 3-го уровня)!
Очень удобно использовать для переадреации сайтов , где используются домены 3го уровня для городов, допустим http://www.spb.site.ru с этим правилом в .htaccess перекинет на http://spb.site.ru , сам юзаю этот способ — очень удобный!
1 2 |
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ http://%1%{REQUEST_URI} [L,R=permanent] |
Стандартная переадресация с одной статической страницы на другую #
1 |
Redirect 301 /was.php http://www.site.ru/new.php |
При этом, новый адрес указывать необходимо полностью с http и доменным именем.
В ряде случаев полезна переадресация через RewriteRule #
1 |
RewriteRule ^dir /dir-new/$1 [R=301,L] |
301-редирект для страницы с GET параметрами #
Скажем, адрес страницы имеет вид: http://www.site.ru/dir/index.php?IBLOCK_ID=1&SECTION_ID=111 тогда для настройки 301 переадресации на новый адрес, необходимо использовать следующее правило:
1 2 |
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=111$ [NC] RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L] |
Если один (или несколько) из GET параметров не задан(ы) или может иметь произвольное значение (в нашем примере это SECTION_ID), можно использовать следующий код:
1 2 |
RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC] RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L] |
301-редирект со страницы без заданного параметра в корень #
Если адрес имеет следующий вид: http://www.site.ru/?abc то для перенаправления подойдет последовательность строчек:
1 2 |
RewriteCond %{QUERY_STRING} ^abc$ [NC] RewriteRule ^$ /? [R=301,L] |
301-редирект для конкретного файла, а не целой папки #
Если требуется настроить переадресацию только для адреса http://www.site.ru/dir/, но при этом чтобы страница http://www.site.ru/dir/index.php?IBLOCK_ID=1 открывалась по старому адресу, необходимо использовать спецсимвол $ в правиле.
1 |
RewriteRule ^dir/$ http://www.site.ru/new-dir/ [R=301,L] |
Как быть с доменами в зоне РФ? #
Для доменов в зоне РФ действуют все те же правила, но только все кириллические символы необходимо заменить на альтернативный код (он на латинице). В частности, сама зона .рф преобразуется в .xn--p1ai.
301-редирект с домена на домен #
1 2 |
RewriteCond %{HTTP_HOST} ^old-site\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] |
И для домена в зоне РФ:
1 2 |
RewriteCond %{HTTP_HOST} ^xn-...\.xn--p1ai$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] |
Настройка переадресации на папки со слешем в конце / #
1 2 3 4 |
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\..{1,10}$ RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301] |
Настройка переадресации на папки без слеша (убираем слеш в конце) #
1 2 3 |
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L] |
301-редирект с домена на папку на другом домене #
1 2 |
RewriteCond %{HTTP_HOST} ^si-te\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/si-te/ [R=301,L] |
Редирект со всех файлов домена, кроме папки администратора bitrix #
1 2 |
RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301] RewriteRule ^(.*)$ http://www.newsite.ru/new/ [L,R=301] |
Редирект всех файлов в папке на заданный файл #
1 |
RewriteRule ^dir(.*)$ /new-file.php [L,R=301] |
Редирект файлов из заданной папки кроме, определенного файла #
1 2 |
RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301] RewriteRule ^dir(.*)$ /all.php [L,R=301] |
Смена страниц с html расширения на php расширение #
1 |
RedirectMatch 301 (.*)\.html$ http://www.new-site.ru$1.php |
Задание типа индексной страницы (php, html, htm и другие) #
Указывается порядок загрузки типов индексного файла, лежащих в корне каталога.
1 |
DirectoryIndex index.html index.php index.htm index.shtml |
Редирект с индексной страницы php на саму папку (корень) #
1 2 |
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ RewriteRule ^index\.php$ http://www.site.ru/ [R=301,L] |
Для всех индексных страниц на сайте:
1 |
RewriteRule ^(.*)index\.php$ http://www.site.ru/$1 [R=301,L] |
Редирект с поддомена на основной домен второго уровня #
1 2 |
RewriteCond %{HTTP_HOST} ^test.site.ru$ [NC] RewriteRule ^(.*)$ http://site.ru%{REQUEST_URI} [R=301,NC,L,QSA] |
Редирект для заданного файла в различных директориях (папках) #
1 |
RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L] |
Код позволяет поставить 301-редирект со всех папок вида http://site.ru/***/uniqe-file.html на один файл в корне /unique-file.html. Бывает полезен при переделке сайта и изменении ссылок.
Если требуется создать ЧПУ-копию какой-либо динамической страницы, то это можно также реализовать с помощью .htaccess. #
1 |
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/
301-редирект с HTTPS-версии на HTTP #
1 2 |
RewriteCond %{HTTPS} "on" RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA] |
Позволяет устранить наличие дублей URL с HTTPS в индексе поисковых систем.
Настройка 403 кода ответа сервера для реф-спама (301-редирект для спама по REFERER) для списка ресурсов #
1 2 3 |
RewriteCond %{HTTP_REFERER} ref-spam-site.ru [NC,OR] RewriteCond %{HTTP_REFERER} another-ref-spam.ru [NC] RewriteRule .* - [F] |
Настройка позволяет отклонить спамный реферальный трафик с ряда ресурсов по заголовку HTTP_REFERER.
Указание пути к файлу 404 ошибки с помощью .htaccess #
Внимание, важно чтобы код ответа сервера для 404 ошибки был именно 404. Путь к файлу указывается с помощью следующей строчки:
1 |
ErrorDocument 404 /404-for-me.php |
! Все правила выполняются в прямом порядке их следования в файле .htaccess и правило, написанное позже, и будет выполняться позже.
! Для сайтов, на которых используется не сервер Apache, аналогичные 301-редиректы легко настраиваются с помощью PHP.
1 2 3 4 5 |
<?php header("HTTP/1.1 301 Moved Permanently"); header("Location: http://www.site.ru/dir/"); exit(); ?> |
! Оптимально настраивать все редиректы сразу на конечную страницу (без промежуточных перенаправлений, в один шаг) это улучшает их восприятие со стороны поисковых систем и пользователей.
Если требуется настроить редирект только для некоторых USER_AGENT’ов, а не для всех пользователей #
1 2 |
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] |
Если требуется настроить редирект для всех поисковых роботов (представлен список их USER_AGENT’ов) #
1 2 |
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] |
Несколько простых примеров #
1 2 3 |
Переадресация с www.site.ru/component/content/?view=featured на www.site.ru/ RewriteCond %{QUERY_STRING} ^view=featured$ [NC] RewriteRule ^component/content/$ /? [R=301,L] |
1 2 3 |
Переадресация с 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] |
Синтаксис для регулярных выражений #
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
. — Точка заменяет произвольный символ. [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] — то же самое. |
Убираем все GET-параметры после знака вопроса (?) #
1 |
RewriteRule (.*) $1? [R=301,L] |
Располагать после: RewriteBase /
Памятка по используемым символам и обозначениям
Строчка RewriteCond — условие выполнения правила RewriteRule. Если условие выполняется, то срабатывает редирект. Правила могут задаваться с помощью регулярных выражений.
Спецсимволы, используемые в правилах и их значения.
1 2 3 4 5 6 |
^ — спецсимвол начала строки; $ — спецсимвол конца строки; ! — спецсимвол отрицания; . — точка, заменяет любой символ, но только один; () — группировка; \ — «экранирующий» слеш, следующий символ после него считается обычным, а не спецсимволом. |
Модификаторы используются после обычных, спецсимволов или их групп и позволяют расширить возможности шаблонов для срабатывания правил.
1 2 3 |
? — символ повторяется 0 или 1 раз. + — повторяется от 1 до 65536 раз. * — повторяется от 0 до 65536 раз. |
Флаги, задают доп. опции для используемого правила. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].
1 2 3 |
NC — флаг NoCase, отключающий проверку регистра символов при срабатывании правила. R — флаг Redirect, производит процесс остановки изменения URL-адреса и возвращает результат. Чаще всего используется значение R=301, но возможны и другие для временных перенаправлений (302, MOVED TEMPORARY). L — флаг Last, останавливает формирования URL-адреса и строка считается окончательной. |
Информация взята с сайта : http://www.pixelplus.ru/studio/stat/kak-sdelat-301-redirekt/